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

ZOJ 3471(状态压缩DP)

时间:2017-09-04 21:26:08      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:条件   freopen   type   names   根据   最大   txt   pre   表示   

题意:有n个原子,每当两个原子碰撞时就会产生能量,并且消耗其中一个原子。已知每两个原子碰撞时消耗其中指定一个原子所产生的能量,问最多能产生多少能量?

状态表示 dp[state] 状态为state时的最大能量

转移方程  dp[state] = max(dp[state],dp[state‘]+a[i][j])

边界条件  dp[i] = 0

#include <algorithm>
#include <cstdio>
#include <cstring>

#define Max 1000001
#define MAXN 11
#define MOD 100000000
#define rin freopen("in.txt","r",stdin)
#define rout freopen("1.out","w",stdout)
#define Del(a,b) memset(a,b,sizeof(a))
#define INF 0x1f1f1f1f
using namespace std;
typedef long long LL;
const int MAXNUM=(1<<MAXN);
int n;
int a[MAXN][MAXN];
int dp[MAXNUM];
int main() {
    //rin;
    while(scanf("%d",&n)!=EOF){
        if(n==0)
            break;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                scanf("%d",&a[i][j]);
            }
        }
        Del(dp,0);
        int full=1<<n;
        for(int s=0;s<full;s++){
            for(int i=0;i<n;i++){
                if((s&(1<<i)))continue;
                for(int j=0;j<n;j++){
                    if(i==j)continue;
                    if((s&(1<<j)))continue;
                    int newS=(s|(1<<j));//从s状态中删去有气体j的状态
                    dp[newS]=max(dp[newS],dp[s]+a[i+1][j+1]);
                }
            }
        }
        int ans=0;
        for(int s=0;s<full;s++)
            ans=max(ans,dp[s]);
        printf("%d\n",ans);
    }
    return 0;
}

根据s由大到小还是由小到大,转移方程不同。

  for(int i=(1<<n)-1;i>=0;i--)  
     for(int j=0;j<n;j++)  
     {  
         if(i&(1<<j))  
         {  
           for(int k=0;k<n;k++)  
           {  
              if(k==j)continue;  
              if(i&(1<<k))continue;  
              dp[i]=max(dp[i],dp[i|(1<<k)]+a[j][k]);  
            }  
          }  
     } 

 

ZOJ 3471(状态压缩DP)

标签:条件   freopen   type   names   根据   最大   txt   pre   表示   

原文地址:http://www.cnblogs.com/Belleaholic/p/7475519.html

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