同类类于poj3311,但是要简单,不用转什么弯子
直接 十种气体 每种是否存在的状态 s,然后 dp[s] = max(dp[s],dp[s - {被碰的气体状态}] + 两气体相碰获得的价值);想起来不难,写起来也算比较简单
int n; int dp[1<<12]; int mp[10 + 5][10 + 5]; void init() { memset(mp,0,sizeof(mp)); memset(dp,0,sizeof(dp)); } bool input() { while(cin>>n,n) { for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&mp[i][j]); return false; } return true; } void cal() { int ans = 0; for(int i=0;i<(1<<n);i++) { for(int j=0;j<n;j++) { if(!(i&(1<<j)))continue; for(int k=0;k<n;k++) { if(!(i&(1<<k)))continue; if(j == k)continue; dp[i] = max(dp[i],dp[i^(1<<j)] + mp[k][j]); } } ans = max(ans,dp[i]); } cout<<ans<<endl; } void output() { } int main () { while(true) { init(); if(input())return 0; cal(); output(); } return 0; }
ZOJ3471 MostPowerful 状压DP,布布扣,bubuko.com
时间: 2024-12-28 13:07:18