• CodeForces 73C LionAge II Dp


    Description

    Vasya plays the LionAge II. He was bored of playing with a stupid computer, so he installed this popular MMORPG, to fight with his friends. Vasya came up with the name of his character — non-empty string s, consisting of a lowercase Latin letters. However, in order not to put up a front of friends, Vasya has decided to change no more than k letters of the character name so that the new name sounded as good as possible. Euphony of the line is defined as follows: for each pair of adjacent letters x and y (x immediately precedes y) the bonusc(x, y) is added to the result. Your task is to determine what the greatest Euphony can be obtained by changing at most k letters in the name of the Vasya's character.

    Input

    The first line contains character's name s and an integer number k (0 ≤ k ≤ 100). The length of the nonempty string s does not exceed100. The second line contains an integer number n (0 ≤ n ≤ 676) — amount of pairs of letters, giving bonus to the euphony. The next nlines contain description of these pairs «x y c», which means that sequence xy gives bonus c (x, y — lowercase Latin letters,  - 1000 ≤ c ≤ 1000). It is guaranteed that no pair x y mentioned twice in the input data.

    Output

    Output the only number — maximum possible euphony оf the new character's name.

    Sample Input

    Input
    winner 4
    4
    s e 7
    o s 8
    l o 13
    o o 8
    
    Output
    36
    Input
    abcdef 1
    5
    a b -10
    b c 5
    c d 5
    d e 5
    e f 5
    
    Output
    20

    Hint

    In the first example the most euphony name will be looser. It is easy to calculate that its euphony is 36.


    -----------------------

    注意初始化的问题。

    ----------------------

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <vector>
    
    using namespace std;
    
    const int OO=1e9;
    
    int f[111][1111][33];
    int a[33][33];
    char s[1111];
    bool v[111][1111][33];
    int k;
    
    int main()
    {
        int n;
        char x,y;
        int c;
        memset(a,0,sizeof(a));
        memset(f,0,sizeof(f));
        memset(v,0,sizeof(v));
        cin>>(s+1)>>k;
        cin>>n;
        for (int i=1; i<=n; i++)
        {
            cin>>x>>y>>c;
            a[x-'a'][y-'a']=c;
        }
        int len=strlen(s+1);
    
        for (int i=0;i<=len;i++)
        {
            for (int j=0;j<26;j++)
            {
                for (int l=0;l<=k;l++)
                {
                    f[l][i][j]=-OO;
                }
            }
        }
    
        for (int i=0;i<26;i++)
        {
            if (s[1]-'a'==i)
            {
                f[0][1][i]=0;
            }
            else
            {
                f[1][1][i]=0;
            }
        }
    
        for (int i=2; i<=len; i++)
        {
            for (int j=0; j<26; j++)
            {
                if (j==s[i]-'a')
                {
                    for (int l=0; l<=k; l++)
                        for (int t=0; t<26; t++)
                        {
                            f[l][i][j]=max( f[l][i][j], f[l][i-1][t]+a[t][j] );
                        }
    
                }
                else
                {
                    for (int l=1; l<=k; l++)
                        for (int t=0; t<26; t++)
                        {
                            f[l][i][j]=max( f[l][i][j], f[l-1][i-1][t]+a[t][j] );
                        }
                }
            }
        }
    
        int ans=-OO;
        for (int l=0; l<=k; l++)
        {
            for (int j=0; j<26; j++)
            {
                if (f[l][len][j]>ans) ans=f[l][len][j];
            }
        }
        cout<<ans<<endl;
    
        return 0;
    }



  • 相关阅读:
    (转)typedef用法
    (转)在用户空间发生中断时,上下文切换的过程
    (转)内核中断,异常,抢占总结篇
    (转)中断上下文和进程上下文的区别
    (转)C中的volatile用法
    (转)gcc学习笔记
    (转)C系程序员面试必知必会之大端小端
    (转)我在北京工作这几年 – 一个软件工程师的反省
    (转)忠告
    Linux下VLAN功能的实现 (转)
  • 原文地址:https://www.cnblogs.com/cyendra/p/3226381.html
Copyright © 2020-2023  润新知