zoj3471 Most Powerful(状态压缩dp)

来源:互联网 发布:海康提示网络不可达 编辑:程序博客网 时间:2024/05/29 14:31

zoj3471

分析

引用别人的分析:“用10位二进制表示气体是否存在,0表示存在,1表示不存在,S(上一个状态)中的两种气体碰撞并且有一种消失,可以得到newS的状态(状态转移)”。dp[state] = max(dp[state],dp[state’]+a[i][j])

题目

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4257

代码

#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <iostream>using namespace std;int data[15][15];int dp[(1<<10)+10];int n;int main(){    while(scanf("%d",&n)!=EOF&&n)    {        for(int i=0; i<n; i++)            for(int j=0; j<n; j++)                scanf("%d",&data[i][j]);        memset(dp,0,sizeof(dp));        for(int s=0; s<(1<<n); s++)        {            for(int i=0; i<n; i++)            {                if(s&(1<<i))                {                    for(int j=0; j<n; j++)                        if(j!=i&&!(s&(1<<j)))                        {                            int ns=s+(1<<j);                            dp[ns]=max(dp[ns],dp[s]+data[i][j]);                        }                }            }        }        int ans=0;        for(int i=0; i<(1<<n); i++)            ans=max(ans,dp[i]);        printf("%d\n",ans);    }    return 0;}
0 0
原创粉丝点击