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