CodeForces 73C LionAge II

来源:互联网 发布:中国软件资讯网 编辑:程序博客网 时间:2024/05/02 04:30
C. LionAge II
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

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 bonus c(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 exceed 100. The second line contains an integer number n (0 ≤ n ≤ 676) — amount of pairs of letters, giving bonus to the euphony. The next n lines 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 test(s)
input
winner 44s e 7o s 8l o 13o o 8
output
36
input
abcdef 15a b -10b c 5c d 5d e 5e f 5
output
20
Note

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

题意:给你一个串,你一次操作可以改变任意一个字符,但是你的操作次数最多为k次。再给出n对

代表这两个字符如果相邻,那么会产生c的价值。问最后你可以得到的最多价值是多少。

思路:很明显是一道dp的题目,于是就开始想dp的状态,首先给定字符串的长度一定是要的,操作

次数也是要的,但是这样还是不够解。于是就想了一个三维的dp;

dp[pos][k][i]: pos--代表第pos位,k--代表改变了k次,i代表把pos这个位子的字符改成i;

状态转移 从当前pos位置状态推出pos+1位置的状态。这时候只需要再for一个下一个状态的字符是什

么,就可以进行转移了,如果下一个状态的字符就是原串的字符那么k不改变,如果不是那么k+1;


#include<stdio.h>#include<string.h>#include<algorithm>#include<math.h>#include<iostream>#include<stdlib.h>#include<set>#include<map>#include<queue>#include<stack>#include<vector>#include<bitset>#pragma comment(linker, "/STACK:1024000000,1024000000")template <class T>bool scanff(T &ret){    char c; int sgn; T bit=0.1;    if(c=getchar(),c==EOF) return 0;    while(c!='-'&&c!='.'&&(c<'0'||c>'9')) c=getchar();    sgn=(c=='-')?-1:1;    ret=(c=='-')?0:(c-'0');    while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');    if(c==' '||c=='\n'){ ret*=sgn; return 1; }    while(c=getchar(),c>='0'&&c<='9') ret+=(c-'0')*bit,bit/=10;    ret*=sgn;    return 1;}#define inf 1073741824#define llinf 4611686018285162540LL#define eps 1e-8#define mod 9223372034707292160LL#define pi acos(-1.0)#define lth (th<<1)#define rth (th<<1|1)#define rep(i,a,b) for(int i=a;i<=b;i++)#define drep(i,a,b) for(int i=a;i>=b;i--)#define mset(x,val) memset(x,val,sizeof(x))#define mcpy(x,y) memcpy(x,y,sizeof(y))#define findx(x) lower_bound(b+1,b+1+bn,x)-b#define fuck puts("FUCK!")#define mpii(a,b) make_pair(a,b);#define NN 101010#define MM 202020using namespace std;typedef unsigned long long ll;typedef long double lb;typedef pair<int,int> pii;int dp[111][111][111],kk,len,n,val;char s[111],c,d;int a[268][268];int main(){    scanf("%s%d",s,&kk);    scanf("%d%*C",&n);    len=strlen(s);    mset(dp,0);    mset(a,0);    rep(i,1,n){        scanf("%c%*C%c",&c,&d);        scanf("%d%*C",&val);        a[c][d]=val;    }    rep(pos,0,len){        rep(k,0,kk){            for(int i='a';i<='z';i++){                dp[pos][k][i]=-inf;            }        }    }    for(int i='a';i<='z';i++) dp[0][1][i]=0;    dp[0][0][s[0]]=0;    rep(pos,0,len){        rep(k,0,kk){            for(int i='a';i<='z';i++){                if(dp[pos][k][i]==-inf) continue;                for(int j='a';j<='z';j++){                    int tmp=1;                    if(s[pos+1]==j)tmp=0;                    dp[pos+1][k+tmp][j]=max(dp[pos+1][k+tmp][j],dp[pos][k][i]+a[i][j]);                }            }        }    }    int ans=-inf;    for(int i=0;i<=kk;i++){        for(int j='a';j<='z';j++){            ans=max(ans,dp[len-1][i][j]);        }    }    printf("%d\n",ans);    return 0;}



0 0
原创粉丝点击