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 ",ans); } return 0; }