Most Powerful
Recently, researchers on Mars have discovered N powerful atoms. All of them are different. These atoms have some properties. When two of these atoms collide, one of them disappears and a lot of power is produced. Researchers know the way every two atoms perform when collided and the power every two atoms can produce.
You are to write a program to make it most powerful, which means that the sum of power produced during all the collides is maximal.There are multiplecases. The first line of each case has an integer N (2 <= N <= 10), whichmeans there are N atoms: A1, A2, ... , AN.Then N lines follow. There are N integers in each line. The j-th integer on thei-th line is the power produced when Ai and Aj collidewith Aj gone. All integers are positive and not larger than 10000.
The last case isfollowed by a 0 in one line.
There will be no morethan 500 cases including no more than 50 large cases that N is 10.
Output the maximalpower these N atoms can produce in a line for each case.
2 0 4 1 0 3 0 20 1 12 0 1 1 10 0 0
4 22
题目思路
dp[i][j]表示进行i此操作后所有原子状态为j的最大值,j中第k位为1表示第k个原子已消失。
最后的答案要循环一遍枚举((1<<n)-1)状态每一位赋值0的最大值,因为n个原子只能有n-1次操作。
位运算不清楚优先级的地方一定要记得打括号,这里卡了我好久。。。
代码如下
#include<bits/stdc++.h> #define ll long long using namespace std; int n,dp[11][1<<10],m[11][11],ans; int main() { while(1) { ans = 0; memset(dp,0,sizeof(dp)); cin>>n; if(n==0) break; for(int i = 0;i<n;i++) for(int j = 0;j<n;j++) scanf("%d",&m[i][j]); for(int i = 1;i<n;i++)//阶段 for(int j = 0;j<1<<n;j++)//状态 for(int k = 0;k<n;k++) for(int h = 0;h<n;h++) if(k!=h&&(!(j>>k&1))&&(!(j>>h&1))) dp[i][j|(1<<k)] = max(dp[i][j|(1<<k)],dp[i-1][j]+m[h][k]); for(int i = 0;i<n;i++) ans = max(ans,dp[n-1][(((1<<n)-1)&(~(1<<i)))]); cout<<ans<<endl; } return 0; }
原文:https://www.cnblogs.com/loganacmer/p/11312226.html