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;
}