码迷,mamicode.com
首页 > 其他好文 > 详细

状态压缩DP SRM 667 Div1 250

时间:2015-09-12 20:23:55      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

 

题意:给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];
   }
};

  

状态压缩DP SRM 667 Div1 250

标签:

原文地址:http://www.cnblogs.com/Running-Time/p/4803452.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!