codeforces LionAge II DP

来源:互联网 发布:淘宝店铺显示的销量 编辑:程序博客网 时间:2024/06/11 08:36

题意:a,b两个紧挨的字符在字符串中会得到一定的分数,现在在一个字符串中要求可以改变k个字符,求最终可以得到的最高分。

做法:dp[i][j][k]表示修改了i次,字串1-j的末尾字符是k,然后不难想出状态转移。动态规划的好处就是压缩记录了前面的状态,然后又有一个递推关系,以此来省时间。

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#define eps -1e8using namespace std;int gra[30][30];int dp[102][102][30];int main(){    int k,m,len,ans=eps;    char str[102];    str[0]='a';    scanf("%s%d",&str[1],&k);    scanf("%d",&m);    getchar();    for(int i=0;i<102;i++)      for(int j=0;j<102;j++)        for(int k=0;k<30;k++)      dp[i][j][k]=eps;    while(m--)    {        char u,v;        u=getchar();getchar();        v=getchar();        u=u-'a'+1;v=v-'a'+1;        scanf("%d",&gra[u][v]);getchar();    }    for(int x=1;x<=26;x++)    if(x==str[1]-'a'+1)dp[0][1][x]=0;    else dp[1][1][x]=0;    for(int i=2;str[i];i++)      for(int kk=0;kk<=k;kk++)       for(int x=1;x<=26;x++)       {           if(x!=str[i]-'a'+1&&kk>0)            for(int y=1;y<=26;y++)            if(dp[kk-1][i-1][y]!=eps)             dp[kk][i][x]=max(dp[kk][i][x],dp[kk-1][i-1][y]+gra[y][x]);           if(x==str[i]-'a'+1)           for(int y=1;y<=26;y++)           if(dp[kk][i-1][y]!=eps)           dp[kk][i][x]=max(dp[kk][i][x],dp[kk][i-1][y]+gra[y][x]);       }       len=strlen(str);       for(int i=0;i<=k;i++)        for(int j=1;j<=26;j++)       ans=max(dp[i][len-1][j],ans);       printf("%d\n",ans);    return 0;}


原创粉丝点击