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

转载于:https://www.cnblogs.com/kiuhghcsc/p/5826407.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值