标签:
题意:给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]; } };
标签:
原文地址:http://www.cnblogs.com/Running-Time/p/4803452.html