本来上周五是想好好做就算没有奖金最差没准能混一个校招直通,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;
}