Most Powerful(状压DP水题)

时间:2021-01-26 20:51:28

题目链接:

https://ac.nowcoder.com/acm/problem/15832

题目大意:

自己翻译,注意每次碰撞是两个中的一个消失,并不是两个都消失

具体思路:

dp[i]表示i这个状态最大的能量是多少,三重for循环枚举

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;  3 # define ll long long
 4 # define inf 0x3f3f3f3f
 5 # define LL_inf (1ll<<60)  6 const int maxn = 2e5+100;  7 int dp[1024+100];  8 int a[15][15];  9 int main() 10 { 11     int n; 12     while(~scanf("%d",&n)&&n) 13  { 14         memset(dp,0,sizeof(dp)); 15         for(int i=0; i<n; i++) 16  { 17             for(int j=0; j<n; j++) 18  { 19                 scanf("%d",&a[i][j]); 20  } 21  } 22         int maxstate=(1<<n)-1; 23         int maxx=0; 24         for(int i=0; i<=maxstate; i++) 25  { 26             for(int j=0; j<n; j++) 27  { 28                 for(int k=0; k<n; k++) 29  { 30                     if(k==j) 31                         continue; 32                     if((i&(1<<j))==0 && (i&(1<<k))==0) 33                         dp[i^(1<<j)]=max(dp[i^(1<<j)],dp[i]+a[k][j]); 34                     maxx=max(maxx,dp[i^(1<<j)]); 35  } 36  } 37  } 38         printf("%d\n",maxx); 39  } 40     return 0; 41 }

acm生涯应该就到此结束了