您的位置:首页 > 其它

SRM 586 DIV1

2014-04-02 21:12 260 查看
A

  考虑都是格点 , 枚举所有y+-0.5就行了.

  trick是避免正好在y上的点重复统计.

int f[maxn][30][30] , len[maxn] , n;

int dfs(int i,int a,int o,vector<int> L) {
int & res = f[i][a][o];

if (res == -1){
res = INF;
if (i==n) {
if (o==0) {
res = 0;
}
} else {
int s = i-1>=0?len[i-1]:0;
int m = min(L[i],26);
for (int c=0 ; c<=m && c<=o ; c++ ) {
for (int p=0 ; c+p<=m && p<=a ; p++ ) {
for (int u=0 ; p+u+c<=m && u+c<=o ; u++ ) {
int k = m-(c+u+p);
if (p+k>a) continue;
int w = dfs(i+1,a-k-p,o-c+p,L);
if (u > 0 ) {
w += s*c + (c-1)*c/2;
w -= (s+L[i]-1)*p - (p-1)*p/2;
} else {
w += s*c + (c-1)*c/2;
w -= (s+L[i]-1)*p - (p-1)*p/2;
w += L[i]-(c+p+k);
}
res = min(res,w);
}
}
}
}
}
return f[i][a][o] = res;
}

int StringWeight::getMinimum(vector <int> L) {
n = L.size();
memset(f, -1, sizeof(f));
for (int i=0 ; i<n ; i++ ) len[i] = i==0?L[i]:len[i-1]+L[i];
int ans = dfs(0,26,0,L);
return ans;
}


View Code

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: