您的位置:首页 > 其它

状态压缩DP SRM 667 Div1 250

2015-09-12 19:17 288 查看
题意:给n个01串,设计一种顺序,使得每次新出现的1的个数^2和最小

分析:比赛时不知道是div1的题,以为暴力贪心可以过,结果被hack掉了。题解说没有充分的证明使用贪心是很有风险的,正解是用状态压缩DP,详细解释

收获:爆零还能涨分,TC真奇怪。

代码:

int dp[(1<<20)+10];
int a[55];

class OrderOfOperations {
public:
int minTime( vector <string> s ) {
int n = s.size (), m = s[0].length ();
memset (a, 0, sizeof (a));
int tot = 0;
for (int i=0; i<n; ++i) {
for (int j=0; j<m; ++j) {
if (s[i][j] == '1') a[i] |= (1<<j);
}
tot |= a[i];
}
memset (dp, INF, sizeof (dp));
dp[0] = 0;
for (int i=0; i<(1<<m); ++i)    {
for (int j=0; j<n; ++j) {
int x = i | a[j];                       //从i状态转移到x的状态
int y = x - i;                          //表示新出现的1
int k = __builtin_popcount (y);         //内置函数,快速得到二进制下1的个数
dp[x] = min (dp[x], dp[i] + k * k);     //类似Bellman_Ford
}
}

return dp[tot];
}
};


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