HDU 5074:Hatsune Miku(2014 Asia AnShan Regional Contest)
Hatsune Miku
题目链接:
http://acm.split.hdu.edu.cn/showproblem.php?pid=5074
题意:
给出n和m,然后输入一个由m*m的矩阵a,再输入n个数字b,-1代表这个数字可以变成1~m中的任何一个,求a[b[1]][b[2]]+a[b[2]][b[3]]+...+a[b[n-1]][b[n]]的最大值
题解:
设dp[i][j]为数组b取前 i 个元素且第 i 个元素是 j 时可以得到的最大值,水之
代码
include<stdio.h>
#include<math.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int N=51;
int mmax(int x,int y)
{
return x>y?x:y;
}
int a[N][N],dp[101][N],s[101];
void solve()
{
int T,n,m,res;
scanf("%d",&T);
while(T--)
{
memset(dp,-1,sizeof(dp));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i)
for(int j=1;j<=m;++j)
scanf("%d",&a[i][j]);
for(int i=1;i<=n;++i)
scanf("%d",&s[i]);
for(int i=1;i<=n;++i)
if(s[i]==-1)
for(int j=1;j<=m;++j)
{
dp[i][j]=0;
for(int k=1;k<=m;++k)
if(dp[i-1][k]!=-1)
dp[i][j]=mmax(dp[i][j],dp[i-1][k]+a[k][j]);
}
else
{
dp[i][s[i]]=0;
for(int j=1;j<=m;++j)
if(dp[i-1][j]!=-1)
dp[i][s[i]]=mmax(dp[i][s[i]],dp[i-1][j]+a[j][s[i]]);
}
res=-1;
for(int i=1;i<=m;++i)
if(dp[n][i]>res)res=dp[n][i