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];
		printf("%d\n",res);
	}
}
int main()
{
	solve();
	return 0;
}
posted @ 2016-08-31 16:19  kiuhghcsc  阅读(231)  评论(0编辑  收藏  举报