CF18E dp

dp[i][j][k]代表第i行为jkjkjkj….
直接转移就好

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
char s[505];
int dp[505][26][26],n,m,pre[505][26][26][2];
void dfs(int i, int j, int k)
{
    if(!i) return;
    dfs(i-1,pre[i][j][k][0],pre[i][j][k][1]);
    for(int i=0;i<m;i++) putchar(((i&1)?k:j)+'a');
    puts("");
}
int main()
{
    scanf("%d%d",&n,&m);
    memset(dp,63,sizeof(dp));
    for(int i=0;i<26;i++)for(int j=0;j<26;j++)dp[0][i][j]=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%s",s);
        for(int j=0;j<26;j++)
            for(int k=0;k<26;k++)
            {
                if(j==k)continue;
                int cnt=0;
                for(int p=0;p<m;p++)
                    (p&1)?cnt+=(s[p]-'a'!=k):cnt+=(s[p]-'a'!=j);
                for(int q=0;q<26;q++)
                {
                    if(q==j)continue;
                    for(int w=0;w<26;w++)
                    {
                        if(k==w||q==w)continue;
                        if(dp[i-1][q][w]+cnt<dp[i][j][k])
                        {
                            dp[i][j][k]=dp[i-1][q][w]+cnt;
                            pre[i][j][k][0]=q;
                            pre[i][j][k][1]=w;
                        }
                    }
                }
            }
    }
    int x=0,y=0,ans=0x3f3f3f3f;
    for(int i=0;i<26;i++)
        for(int j=0;j<26;j++)
            if(ans>dp[n][i][j])
            {ans=dp[n][i][j],x=i,y=j;}
    printf("%d\n",dp[n][x][y]);
    dfs(n,x,y);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值