ZOJ 1642 Match for Bonus(LCS)

来源:互联网 发布:学雅思的软件 编辑:程序博客网 时间:2024/06/06 17:11

题意:给出每个字符的权值,求两个字符串的子序列能够获得的最多权值.

解法:就是LCS问题,只不过长度变成了权值.

题目里没给出字符长度WA好几次,2300左右就差不多了.

#include <cstdio>#include <algorithm>#include <memory.h>using namespace std;const int MAX = 2200;int dp[MAX][MAX];int bonus[256];char s1[MAX], s2[MAX];int main(int argc, char const *argv[]){int N;while(scanf("%d", &N) == 1){memset(bonus, 0, sizeof(bonus));for(int i = 1; i <= N; ++i){char c[2];int v;scanf("%s %d", c, &v);bonus[c[0]] = max(bonus[c[0]], v);}getchar();memset(dp, 0, sizeof(dp));gets(s1 + 1);gets(s2 + 1);int len1 = strlen(s1 + 1), len2 = strlen(s2 + 1);for(int i = 1; i <= len1; ++i){for(int j = 1; j <= len2; ++j){if(s1[i] == s2[j]){dp[i][j] = dp[i - 1][j - 1] + bonus[s1[i]];}else{dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);}}}printf("%d\n", dp[len1][len2]);}return 0;}


0 0