字节笔试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);
}

posted @ 2021-05-15 16:18  blueattack  阅读(47)  评论(0编辑  收藏  举报