zoj 3471 状压DP

来源:互联网 发布:万网域名登录地址 编辑:程序博客网 时间:2024/06/11 00:49

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

难度远不及我之前发的...

但是我第一次的思路竟然错了,因为dp方程想设计成二维,但是弄错,也没发现原因,,,

改为一维:dp[s]:状态为s的时候,得到的最大能量,其中s第i位为1表示,i已经被撞毁

#include <cstdio>#include <cstring>#include <algorithm>#include <string>#include <iostream>#include <cmath>#include <map>#include <queue>using namespace std;#define ls(rt) rt*2#define rs(rt) rt*2+1#define ll long long#define rep(i,s,e) for(int i=s;i<e;i++)#define repe(i,s,e) for(int i=s;i<=e;i++)#define CL(a,b) memset(a,b,sizeof(a))#define IN(s) freopen(s,"r",stdin)#define OUT(s) freopen(s,"w",stdout)const int MAXN = 12;int n;int mat[MAXN][MAXN];int dp[1<<MAXN];int scnt;void init(){    CL(mat,0);    CL(dp,0);}int main(){    //IN("zoj3471.txt");    int w;    while(~scanf("%d",&n) && n)    {        init();        for(int i=0;i<n;i++)            for(int j=0;j<n;j++)            {                scanf("%d",&w);                mat[i][j]=max(mat[i][j],w);            }        int S=1<<n;        int ans=0;        for(int s=0;s<S;s++)        {            for(int i=0;i<n;i++)            {                if((s&(1<<i)))continue;//i不在s                //if(s == (1<<i))dp[s][i]=0;               // else                for(int j=0;j<n;j++)                {                    if(i == j)continue;                    if(!(s&(1<<j)) || !mat[i][j])continue;//j在s,但<span style="font-family: Arial, Helvetica, sans-serif;">dp[s^(1<<j)]中j不在s</span>                    dp[s]=max(dp[s],dp[s^(1<<j)]+mat[i][j]);//用i撞j                    //ans=max(dp[s][i],ans);                }            }        }        for(int s=0;s<S;s++)                ans=max(dp[s],ans);        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击