字节笔试4
给定一个字符串s,另一个长度为2的字符串t,可以最多修改s x次,求s的子序列为t的最大次数
代码如下:
#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
#include<cstring>
#include<string>
using namespace std;
//给定一个字符串s,另一字符串t长为2。可以最多修改k次,求s的子序列最多出现多少个t
//dp[i][j][k]表示前i个字符,修改了j个字符,其中t[0]出现次数为k符合条件的个数
int dp[250][250][250];
char s[250],t[2];
int main()
{
int n,x;
scanf("%d%d",&n,&x);
scanf("%s",s+1)
scanf("%s",t);
if(t[0]==t[1]){
for(int i=1;i<=n;i++) if(s[i]==t[0]) cnt++;
cnt=min(n,cnt+x);
printf("%d\n",cnt*(cnt-1)/2);
}
memset(dp,-1,sizeof(dp));
dp[0][0][0]=1;
for(int i=0;i<s.size();i++){
for(int j=0;j<=x;j++){
for(int k=0;k<=i;k++){
if(dp[i][j][k]==-1) continue;
dp[i+1][j][k]=max(dp[i+1][j][k],dp[i][j][k]);//不做任何修改
if(s[i+1]==t[0]) dp[i+1][j][k+1]=max(dp[i+1][j][k+1],dp[i][j][k]); //本身就是t[0]
if(s[i+1]==t[1]) dp[i+1][j][k]=max(dp[i+1][j][k],dp[i][j][k]+k) //不做修改
if(j+1<=x) dp[i+1][j+1][k+1]=max(dp[i+1][j+1][k+1],dp[i][j][k]);//修改为t[0]
if(j+1<=x) dp[i+1][j+1][k]=max(dp[i+1][j+1][k],dp[i][j][k]+k); //修改为t[1]
}
}
}
int ans=0;
for(int i=0;i<=x;i++) for(int j=0;j<=n;j++) ans=max(dp[n][i][j]);
printf("%d\n",ans);
}