您的位置:首页 > 其它

Match for Bonus

2014-08-04 16:55 363 查看
【题目来源】多校2014 zoj1642

【题目含义】 题目给你每一个字母的价值,然后给你两个字符串a,b,如果a串第i个字符和b串第j个字符相同,则加上该字符的价值,如果不相等则什么也不做。

【题目分析】该题就是求字符串a和字符串b的最长公共子序列,只不过,在字符相同时不再是加1,而是加上该字符的价值。

【代码】

#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXN 10+2000
using namespace std;

char a[MAXN],b[MAXN];
struct node{
    char ch;
    int v;
}t[MAXN];
int res[MAXN][MAXN];

void init()
{
    for(int i = 0; i < MAXN; i++)
        res[0][i] = res[i][0] = 0;
}

int find(char ch)
{
    int i = 1;
    while(t[i].ch != ch)
        i++;
    return t[i].v;

}
int main()
{
    //freopen("in.txt","r",stdin);
    int n;
    init();
    while(cin>>n){
        getchar();
        for(int i = 1; i <= n; i++){
            t[i].ch=getchar();
            getchar();
            scanf("%d",&t[i].v);
            getchar();
        }
        scanf("%s%s",a+1,b+1);
        int len_a = strlen(a+1);
        int len_b = strlen(b+1);
        for(int i = 1; i <= len_a; i++){
            for(int j = 1; j <= len_b; j++){
                if(a[i] == b[j]){
                    res[i][j] = res[i-1][j-1] + find(a[i]);
                }
                else{
                    res[i][j] = max(res[i][j-1],res[i-1][j]);
                }
            }
        }
        cout<<res[len_a][len_b]<<endl;
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: