题目地址:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2860
唉。。校赛的时候把这题用搜索的时间复杂度2^15次方想成了15^15次方。。。。所以没写。。。后来用的最短路的floyd算法改成了最长路做的,但有一些细节不好处理,调了会没调出来。。赛后才想到用暴搜不会超时。。于是补完线代后怒敲暴搜代码,敲了10分钟然后1Y。。。sad。。。。遗憾。。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <algorithm>
using namespace std;
int mp[20][20], b[20], max1, n;
struct node
{
int a[15], top, ans, x;
};
void bfs()
{
int i, j, x;
queue<node>q;
node f1, f2;
f1.top=0;
f1.x=-1;
f1.ans=0;
q.push(f1);
while(!q.empty())
{
f1=q.front();
q.pop();
//printf("%d\n",f1.ans);
if(f1.x==n-1)
{
if(max1<f1.ans)
max1=f1.ans;
continue ;
}
for(i=0;i<f1.top;i++)
{
f2.a[i]=f1.a[i];
}
f2.ans=f1.ans;
f2.top=f1.top;
f2.x=f1.x+1;
q.push(f2);
f2.top=f1.top+1;
f2.a[f1.top]=f2.x;
f2.ans=f1.ans+b[f2.x];
for(i=0;i<f1.top;i++)
{
f2.ans=f2.ans+mp[f2.a[i]][f2.x];
}
q.push(f2);
}
}
int main()
{
int t, i, j;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&b[i]);
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&mp[i][j]);
}
}
max1=-1;
bfs();
if(max1<0)
printf("0\n");
else
printf("%d\n",max1);
}
return 0;
}