本来上周五是想好好做就算没有奖金最差没准能混一个校招直通,piapiapia打脸啊 ( ̄ε(# ̄)☆╰╮( ̄▽ ̄///)

最开始的想法是尽可能的删掉连续的a或者b,还大费周折的预处理成数组形式orz

看到对象AC的代码,昨天晚上又拽着讲了一遍,基本上是明白了

dp[i][j][k]  

i表示递推到哪位 

j表示当前变化了多少 需要从1~m+1因为这种写法默认一开始就有变化的

k 0当前状态下没有字符 1结尾字符是a 2结尾字符是b

所以dp[i][j][k]=max(dp[i-1][j-1][3-k],dp[i-1][j][k],dp[i-1][j-1][0])+1

初始化自然是dp[i][j][k]=dp[i-1][j][k];

还有就是WA了某次break和continue写错了T^T 就是当第一次变化也就是选取第一个字符的时候是不可以选k=2的

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
char str[100009];
int dp[100009][11][3];
int main()
{
   // freopen("cin.txt","r",stdin);
    while(~scanf("%d%d",&n,&m))
    {
        scanf("%s",str+1);
        memset(dp,-1,sizeof(dp));
        int ans=0;
        dp[0][0][0]=0;
        for(int i=1;i<=n;i++)
        {
            dp[i][0][0]=0;
            for(int j=1;j<=m+1;j++)
            {
                for(int k=1;k<=2;k++)
                {
                    if(k==2&&j==1) break;
                    dp[i][j][k]=dp[i-1][j][k];//不是dp[i][j-1][k]!!
                    if(str[i]-'a'+1!=k) continue;
                    int tmp=max(dp[i-1][j-1][3-k],dp[i-1][j][k]);
                    tmp=max(tmp,dp[i-1][j-1][0])+1;//不是dp[i][j][0]!!
                    if(tmp==0) continue;
                    dp[i][j][k]=max(tmp,dp[i][j][k]);
                    ans=max(ans,dp[i][j][k]);
                }
            }
        }
        printf("%d\n",ans);
    }

    return 0;
}