首页 > 代码库 > ZOJ3471 MostPowerful 状压DP
ZOJ3471 MostPowerful 状压DP
同类类于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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。