您的位置:首页 > 其它

ZOJ 1642 Match for Bonus(LCS)

2014-04-02 17:58 344 查看
题意:给出每个字符的权值,求两个字符串的子序列能够获得的最多权值.

解法:就是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: