zoj 3471Most Powerful
题意:给n个atom(原子),每两个原子相碰会产生能量,不过每次碰撞会消失一个原子,而且不同原子碰撞,消失的原子不同,产生的能量也会不同,给出不同原子相碰撞产生的能量,求出能产生的最多能量。
状态DP
状态s表示n个原子的状态。
每次碰撞只消失一个原子,最后会剩下一个原子不消失,最终的答案是max(dp[(1<<n-1)^(1<<i)]),i 表示最后剩下的原子。
状态转移方程是: i 是 s 中消失的原子,j 是没有消失的原子 dp[s]=max(dp[s^(1<<i)]+map[j][i])
#include<stdio.h> #include<string.h> #define max(a,b) (a)>(b)?(a):(b) int n; int dp[1<<10],map[12][12]; int DP(int s) { if(dp[s]!=-1) return dp[s]; for(int i=0;i<n;i++) { if(!(s&(1<<i))) continue; for(int j=0;j<n;j++) { if(s&(1<<j)) continue; dp[s]=max(dp[s],DP(s^(1<<i))+map[j][i]); } } return dp[s]; } int main() { while(scanf("%d",&n) && n) { for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&map[i][j]); memset(dp,-1,sizeof(dp)); dp[0]=0; int ans=0,all=(1<<n)-1; for(int i=0;i<n;i++) ans=max(ans,DP(all^(1<<i))); printf("%d\n",ans); } return 0; }