(状态压缩) Most Powerfull (ZOJ 3471)
2013-12-10 15:25
369 查看
题意:有N(10个或以内)的原子,每个原子撞任意另一个原子会有一个能量值。然后被撞的会消失掉。
这N个原子有且只有一个。求:最大碰撞能量值。
思路:用一个整数S来表示状态,其二进制的1表示原子还在,0表示已经消失。
dp[S]存在状态S下的最大能量值。
网址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4257
这N个原子有且只有一个。求:最大碰撞能量值。
思路:用一个整数S来表示状态,其二进制的1表示原子还在,0表示已经消失。
dp[S]存在状态S下的最大能量值。
网址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4257
#include <iostream> #include<vector> using namespace std; int n; int map[10][10]; int dp[1<<10]; int main() { freopen("in","r",stdin); int i,j,k; int cur; while (cin>>n,n) { for (i=0;i<n;i++) for (j=0;j<n;j++) scanf("%d",&map[i][j]); int full=(1<<n)-1; for (i=0;i<=full;i++) dp[i]=-1; dp[full]=0; //原子都在的时候能量值为0 for (i=full;i;--i) if (dp[i]!=-1) //此处无太大意义 for (j=0;j<n;j++) if (i&(1<<j)) //第j个原子还在 for (k=0;k<n;k++) if (i&(1<<k) && k!=j) //第k个原子还在并不与j相同 { cur=i^(1<<k); dp[cur]=max(dp[cur],dp[i]+map[j][k]); } int ans=0; for (i=0;i<n;i++) ans=max(ans,dp[1<<i]); cout<<ans<<endl; } return 0; }
相关文章推荐
- zoj 3471 Most Powerful //状态压缩DP
- zoj 3471 Most Powerful 状态压缩dp
- ZOj 3471 Most Powerful 状态压缩DP
- ZOJ3471 Most Powerful,状态压缩DP
- ZOJ 3471 Most Powerful(DP + 状态压缩)
- zoj 3471(状态压缩)
- ZOJ 3471 状态压缩DP
- ZOJ 3471 状态压缩DP
- ZOJ 3471 Most Powerful 【状态压缩】
- ZOJ 3471 压缩状态DP
- ZOJ 3471 Most Powerful (状态压缩)
- zoj 3471【二进制压缩状态DP】
- zoj 3471状态压缩DP
- zoj 3471 Most Powerful(状态压缩+dp)
- ZOJ Most Powerful (状态压缩DP)
- ZOJ - 3471 Most Powerful (状态压缩)
- ZOJ - 3471 Most Powerful (状态压缩)
- zoj 3471 状态压缩dp
- zoj 3471 Most Powerful(状态压缩dp)
- zoj 3471 Most Powerful(状态压缩DP)