题目大意】不超过10种气体,两两之间相互碰撞可以产生一定的能量,如a碰b,那么b气体就消失,自身不能碰自身,问最后所能得到的最大能量。
【题目解析】用10位二进制表示气体是否存在,0表示存在,1表示不存在,S(上一个状态)中的两种气体碰撞并且有一种消失,可以得到newS的状态(状态转移)
【状态表示】dp[state] 状态为state时的最大能量
【转移方程】dp[state] = max(dp[state],dp[state']+a[i][j])
【边界条件】dp[i] = 0;
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <string> #include <deque> #include <queue> #include <stack> #define inf 11111111 using namespace std; int dp[1<<11]; int map[11][11]; int main() { int n,i,j,k,l,m; while(cin >> n) { if(n == 0) break; for (i = 1; i <=n; i++) { for (j = 1; j <=n; j++) { cin >> map[i][j]; } } memset(dp,0,sizeof(dp)); for (i = 0; i < 1<<n; i++) { for (j = 1; j <= n; j++) { if(i&(1<<j-1)) continue; for (k = 1; k <= n; k++) { if(j == k) continue; if(i&(1<<k-1)) continue; int s = i|(1<<k-1); dp[s] = max(dp[s],dp[i]+map[j][k]); } } } int ans = -inf; for (i = 0; i < 1<<n; i++) { ans = max(ans,dp[i]); } cout<<ans<<endl; } }