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.
Input
There are multiple cases. The first line of each case has an integer N (2 <= N <= 10), which means there are N atoms: A1, A2, ... , AN. Then N lines follow. There are N integers in each line. The j-th integer on the i-th line is the power produced when Ai and Aj collide with Aj gone. All integers are positive and not larger than 10000.
The last case is followed by a 0 in one line.
There will be no more than 500 cases including no more than 50 large cases that N is 10.
Output
Output the maximal power these N atoms can produce in a line for each case.
Sample Input
2
0 4
1 0
3
0 20 1
12 0 1
1 10 0
0
Sample Output
4
22
Author: GAO, Yuan
Contest: ZOJ Monthly, February 2011
题意:n中元素,现在两种不同的元素之间可以发生反应并且放出能量,其中一种元素随之消失,现在给出每两种元素之间发生反应产生的能量值关系,求使得这n种元素反应完后能得到的最大能量值。
思路:n的范围比较小,可以想到状态压缩,dp[s]表示元素集合s反应后能得到的最大能量值,那么状态转移方程为dp[s]=max(dp[s],dp[s^(1<<j)]+a[i][j])。
代码:
#include <iostream>
#include <functional>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#pragma comment (linker,"/STACK:102400000,102400000")
#define pi acos(-1.0)
#define eps 1e-6
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define FRE(i,a,b) for(i = a; i <= b; i++)
#define FREE(i,a,b) for(i = a; i >= b; i--)
#define FRL(i,a,b) for(i = a; i < b; i++)
#define FRLL(i,a,b) for(i = a; i > b; i--)
#define mem(t, v) memset ((t) , v, sizeof(t))
#define sf(n) scanf("%d", &n)
#define sff(a,b) scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pf printf
#define DBG pf("Hi\n")
typedef long long ll;
using namespace std;
#define INF 0x3f3f3f3f
#define mod 1000000009
const int maxn = 1005;
const int MAXN = 2005;
const int MAXM = 200010;
const int N = 1005;
int a[11][11],dp[(1<<10)+10],n;
void solve()
{
int m=1<<n;
memset(dp,0,sizeof(dp));
for (int s=0;s<m;s++)
{
for (int i=0;i<n;i++)
{
if (s&(1<<i))
{
for (int j=0;j<n;j++)
{
if (i==j) continue; //这一句千万不要忘记了!
if (s&(1<<j))
{
dp[s]=max(dp[s],dp[s^(1<<j)]+a[i][j]);
}
}
}
}
}
}
int main()
{
//#ifndef ONLINE_JUDGE
// freopen("C:/Users/lyf/Desktop/IN.txt","r",stdin);
//#endif
int i,j;
while (scanf("%d",&n),n)
{
for (i=0;i<n;i++)
for (j=0;j<n;j++)
scanf("%d",&a[i][j]);
solve();
printf("%d\n",dp[(1<<n)-1]);
}
return 0;
}