E-Most Powerful_牛客竞赛动态规划专题班状压dp例题 (nowcoder.com)
题意:
思路:
N<=10
一定是状压DP
状态设计:
设dp[s]为状态为s的最大收益
其中0表示还存在的原子
1表示该原子不存在
转移就是选取两个还存在的原子进行碰撞
Code:
#include <bits/stdc++.h>
using namespace std;
const int mxn=22;
int n,x;
int G[mxn][mxn],dp[1<<15];
void solve(){
while(cin>>n){
if(n==0) break;
memset(G,0,sizeof(G));
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>x;
G[i][j]=x;
}
}
for(int i=0;i<(1<<n);i++){
for(int j=0;j<n;j++){
if((i>>j)&1) continue;
for(int k=0;k<n;k++){
if((i>>k)&1) continue;
if(j==k) continue;
dp[i|(1<<k)]=max(dp[i|(1<<k)],dp[i]+G[j][k]);
}
}
}
int ans=-1;
for(int i=0;i<(1<<n);i++) ans=max(ans,dp[i]);
cout<<ans<<'\n';
}
}
int main(){
int T=1;
//cin>>T;
while(T--)solve();
return 0;
}