
2 5 3 83 86 77 15 93 35 86 92 49 3 3 3 1 2 10 5 36 11 68 67 29 82 30 62 23 67 35 29 2 22 58 69 67 93 56 11 42 29 73 21 19 -1 -1 5 -1 4 -1 -1 -1 4 -1
270 625
-1可以随便转换为1~m的值,求最大值,简单DP
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=150;
int map[maxn][maxn];
int dp[maxn][maxn];
int a[1000];
int main()
{
int n,t,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=1; i<=m; i++)
{
for(int j=1; j<=m; j++)
{
scanf("%d",&map[i][j]);
}
}
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
for(int i=0; i<maxn; i++)
{
for(int j=0; j<maxn; j++)
{
dp[i][j]=-99999999;
}
}
int ans=0;
if(a[1]>0)
dp[1][a[1]]=0;
else
{
for(int i=1; i<=m; i++)
{
dp[1][i]=0;
// printf("%d ",dp[1][i]);
}
}
for(int i=2; i<=n; i++)
{
if(a[i]>0)
{
for(int j=1; j<=m; j++)
{
dp[i][a[i]]=max(dp[i][a[i]],dp[i-1][j]+map[j][a[i]]);
}
}
else
{
for(int j=1; j<=m; j++)
{
for(int k=1; k<=m; k++)
{
dp[i][j]=max(dp[i][j],dp[i-1][k]+map[k][j]);
}
}
}
//printf("%d\n",dp[i][a[i]]);
}
for(int i=1; i<=m; i++)
ans=max(ans,dp[n][i]);
printf("%d\n",ans);
}
return 0;
}
hdu 5074 Hatsune Miku(2014 鞍山现场赛)
原文:http://blog.csdn.net/caduca/article/details/40380057