标签:
题目大意:给你一些音符之间的联系,给你一个串,让你求出这个串的最大值。-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