2008-12-26
SRM394 Div1 Easy: RoughStrings
TLE
・・・メモ化しないと駄目です
#define sz(a) int((a).size())
#define pb push_back
#define all(c) (c).begin(),(c).end()
#define tr(c,i) for(typeof((c).begin()) i=(c).begin(); i!=(c).end(); i++)
#define rep(var,n) for(int var=0;var<(n);var++)
#define found(s,e) ((s).find(e)!=(s).end())
#define remove_(c,val) (c).erase(remove((c).begin(),(c).end(),(val)),(c).end())
class RoughStrings {
int n_;
map<vector<int>,int> memo;
int sub(vector<int> v, int d){
remove_(v,0); // メモ参照の前に0要素を消さないと激しく遅い
if(found(memo,v)) return memo[v]; // これが後
int l=v.size(); if(l<=1) return 0;
sort(all(v));
int minr = v[l-1]-v[0];
if(d==n_) return memo[v]=minr;
if (v[0]>0) {
v[0]--;
minr = min(minr,sub(v,d+1));
v[0]++;
}
v[l-1]--;
minr = min(minr,sub(v,d+1));
v[l-1]++;
return memo[v]=minr;
}
public:
int minRoughness(string s, int n) {
n_=n;
vector<int>cn(26,0);
int m=s.length(); //1-50
rep(i,m) cn[s[i]-'a']++;
return sub(cn,0);
}
};
コメント
トラックバック - https://topcoder-g-hatena-ne-jp.jag-icpc.org/n4_t/20081226