首页 > 其他 > 详细

ZOJ3471--Most Powerful(状压DP)

时间:2015-11-20 20:00:49      阅读:328      评论:0      收藏:0      [点我收藏+]

有n(n<10)个小球,每两个碰撞有其中一个会消失,并产生一定能量。求产生最大能量。

有了正确思路题目比较简单,我的思路果然是歪的。。。

 

我的思路是dp[i][j]表示i这个状态剩下第j个小球,然后转移方程:

dp[j|(1<<i)][i] = max(dp[j|(1<<i)][i], dp[j][k] + power[i][k]);

感觉没什么问题,但是WA了好多好多次呢!

知道自己怎么错的是个大事。。。。。。。。。

因为这样每次都是用碰撞过的小球来碰撞,但是其实比如有四个小球 1和2碰撞 3和4碰撞 然后剩下的两个在碰撞,这样的情况更新不到。

 

副ac代码吧,写的也很挫。。。

#include <iostream>
#include <cstring>

using namespace std;

const int N = 11;
const int MAXN = 1 << N;
int dp[MAXN];
int power[N][N];

int main()
{
    int n;
    while (cin >> n && n)
    {
        for (int i = 0; i < n; ++i)
        {
            for (int j = 0; j < n; ++j)
            {
                cin >> power[i][j];
            }
        }
        int st = (1 << n) - 1;
        memset(dp, 0, sizeof dp);
        for (int s = 0; s <= st; ++s)
        {
            for (int i = 0; i < n; ++i)
            {
                if (((1 << i) & s) == 0)
                for (int j = 0; j < n; ++j)
                {
                    if (((1 << j) & s) == 0)
                    {
                        if (i != j)
                        {
                            dp[s | (1 << i)] = max(dp[s | (1 << i)], dp[s] + power[j][i]);
                        }
                    }
                }
            }
        }
        int ans = 0;
        for (int s = 0; s <= st; ++s)
            ans = max(ans, dp[s]);
        cout << ans << endl;

    }
}

  

ZOJ3471--Most Powerful(状压DP)

原文:http://www.cnblogs.com/wenruo/p/4981730.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!