http://acm.hdu.edu.cn/showproblem.php?pid=5074
状态转移方程:
d[i][j]表示第i个数,选j可以得到的最大值
d[i][j] = max(d[i-1][x]+a[x][j]) 1 <= x <= m
if v[i]>0(第i个数不能改变) j = v[i]-1(m从0开始存入)
if v[i-1]>0 x = v[i-1]-1
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int d[110][60];
int a[60][60];
int t;
int v[110];
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++)
for(int j=0;j<m;j++)
cin>>a[i][j];
for(int i=0;i<n;i++)
cin>>v[i];
memset(d,0,sizeof(d));
for(int i=1;i<n;i++)
for(int j=0;j<m;j++)
for(int x=0;x<m;x++)
{
int jj=j,xx=x;
if(v[i]>0)
jj=v[i]-1;
if(v[i-1]>0)
xx=v[i-1]-1;
d[i][jj]=max(d[i][jj],d[i-1][xx]+a[xx][jj]);
}
int ans=0;
for(int i=0;i<m;i++)
ans=max(ans,d[n-1][i]);
cout<<ans<<endl;
}
return 0;
}