#include <iostream>
#include <cstring>
using namespace std;
int dfs(int cur);
int n;
int d[1<<11];
int money[11][11];
int main()
{
while(cin >> n)
{
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
cin >> money[i][j];
memset(d, -1, sizeof(d));
cout << dfs((1 << n) - 1) << endl;//全部都没合并时,共n个1;
}
}
int dfs(int cur)
{
if(d[cur] != -1) //已算过
return d[cur];
int temp = 0;
int ma = 0;
for(int i = 0; i < n; i++)
{
if((1 << i) & cur) //如果第i个石头存在(没有被合并)
{
int t = cur - (1 << i);
if(t == 0) //如果仅剩第i个石头
return d[cur] = 0;
else //如果还有多个石头
{
temp = 0;
for(int j = 0; j < n; j++)
if((1 << j) & t) //其余石头和第i个石头合并
temp = max(money[j][i], temp); //取其余石头和i合并的最大值
}
ma = max(ma, temp + dfs(t));
}
}
return d[cur] = ma;
}
南阳理工OJ_题目832 合并游戏
最新推荐文章于 2015-04-15 21:03:39 发布