标签:
题目大意:给你一些音符之间的联系,给你一个串,让你求出这个串的最大值。-1的时候可以任意替代,其他情况必须为序列上的数。
解题思路:简单二维dp,分情况处理就可以了啊。

2 5 3 83 86 77 15 93 35 86 92 49 3 3 3 1 2 10 5 36 11 68 67 29 82 30 62 23 67 35 29 2 22 58 69 67 93 56 11 42 29 73 21 19 -1 -1 5 -1 4 -1 -1 -1 4 -1
270 625
#include <algorithm>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <iomanip>
#include <stdio.h>
#include <string>
#include <queue>
#include <cmath>
#include <stack>
#include <ctime>
#include <map>
#include <set>
#define eps 1e-9
///#define M 1000100
///#define LL __int64
#define LL long long
///#define INF 0x7ffffff
#define INF 0x3f3f3f3f
#define PI 3.1415926535898
#define zero(x) ((fabs(x)<eps)?0:x)
#define mod 1000000007
using namespace std;
const int maxn = 110;
int dp[maxn][maxn];
int mp[maxn][maxn];
int num[maxn];
int main()
{
int T;
cin >>T;
while(T--)
{
int n, m;
scanf("%d %d",&m, &n);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++) scanf("%d",&mp[i][j]);
for(int i = 1; i <= m; i++) scanf("%d",&num[i]);
memset(dp, 0, sizeof(dp));
for(int i = 2; i <= m; i++)
{
if(num[i-1] == -1)
{
if(num[i] == -1)
{
for(int j = 1; j <= n; j++)
for(int k = 1; k <= n; k++) dp[i][k] = max(dp[i-1][j]+mp[j][k], dp[i][k]);
continue;
}
for(int j = 1; j <= n; j++)
dp[i][num[i]] = max(dp[i][num[i]], dp[i-1][j]+mp[j][num[i]]);
continue;
}
if(num[i] == -1)
{
for(int j = 1; j <= n; j++)
dp[i][j] = max(dp[i][j], dp[i-1][num[i-1]]+mp[num[i-1]][j]);
continue;
}
dp[i][num[i]] = dp[i-1][num[i-1]]+mp[num[i-1]][num[i]];
}
int Max = 0;
for(int i = 1; i <= n; i++) Max = max(Max, dp[m][i]);
cout<<Max<<endl;
}
return 0;
}标签:
原文地址:http://blog.csdn.net/xu12110501127/article/details/42782093