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;
}



原文地址:https://www.cnblogs.com/cyendra/p/3226381.html