题目大意:
给出一个长度为n的序列,例如a1,a2,a3,a4......an,然后这个序列的美丽值就是mp[a1][a2] + mp[a2][a3] + ..... mp[an-1][an],但是这个序列里面并不是所有的数都是确定的,输入包含一些大于0的数和一些-1,-1表示这个数可以任意,但是要在m的范围内,给出s[i][j],求这个序列最大的美丽值.
解题思路:
dp[i][j]表示序列的第i个数选j的最大美丽值。
①当a[i-1]>0时,就表示第i-1个数只能选a[i-1],所以
dp[i][j]=max(dp[i-1][a[i-1]]+mp[a[i-1]][j])
②当a[i-1]<0时,要开两层循环,分别枚举第i-1个选什么值和当前第i个选什么值
dp[i][k]=max(dp[i-1][j]+mp[j][k]);
#include<bits/stdc++.h>
#include<cstring>
using namespace std;
int a[110];
int mp[110][110];
int dp[110][110];
int main()
{
//freopen("input.txt","r",stdin);
int T;
cin>>T;
int n,m;
while(T--)
{
cin>>n>>m;
for(int i=1;i<=m;++i)
for(int j=1;j<=m;++j)
cin>>mp[i][j];
for(int i=1;i<=n;++i)
cin>>a[i];
memset(dp,0,sizeof(dp));
for(int i=2;i<=n;++i)
{
if(a[i-1]>0)
for(int j=1;j<=m;++j)
dp[i][j]=max(dp[i][j],dp[i-1][a[i-1]]+mp[a[i-1]][j]);
else
{
for(int j=1;j<=m;++j)
for(int k=1;k<=m;++k)
dp[i][k]=max(dp[i][k],dp[i-1][j]+mp[j][k]);
}
}
int ans=0;
for(int i=1;i<=m;++i)
ans=max(ans,dp[n][i]);
cout<<ans<<endl;
}
return 0;
}