题目地址: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;
}