本文共 1236 字,大约阅读时间需要 4 分钟。
题目大意:
给出一个长度为n的序列,例如a1,a2,a3,a4......an,然后这个序列的美丽值就是mp[a1][a2] + mp[a2][a3] + ..... mp[an-1][an],但是这个序列里面并不是所有的数都是确定的,输入包含一些大于0的数和一些-1,-1表示这个数可以任意,但是要在m的范围内,给出s[i][j],求这个序列最大的美丽值.
解题思路:
dp[i][j]表示序列的第i个数选j的最大美丽值。
①当a[i-1]>0时,就表示第i-1个数只能选a[i-1],所以
dp[i][j]=max(dp[i-1][a[i-1]]+mp[a[i-1]][j])
②当a[i-1]<0时,要开两层循环,分别枚举第i-1个选什么值和当前第i个选什么值
dp[i][k]=max(dp[i-1][j]+mp[j][k]);
#include#include using namespace std;int a[110];int mp[110][110];int dp[110][110];int main(){ //freopen("input.txt","r",stdin); int T; cin>>T; int n,m; while(T--) { cin>>n>>m; for(int i=1;i<=m;++i) for(int j=1;j<=m;++j) cin>>mp[i][j]; for(int i=1;i<=n;++i) cin>>a[i]; memset(dp,0,sizeof(dp)); for(int i=2;i<=n;++i) { if(a[i-1]>0) for(int j=1;j<=m;++j) dp[i][j]=max(dp[i][j],dp[i-1][a[i-1]]+mp[a[i-1]][j]); else { for(int j=1;j<=m;++j) for(int k=1;k<=m;++k) dp[i][k]=max(dp[i][k],dp[i-1][j]+mp[j][k]); } } int ans=0; for(int i=1;i<=m;++i) ans=max(ans,dp[n][i]); cout< <
转载地址:http://iufgf.baihongyu.com/