zoukankan      html  css  js  c++  java
  • 字节笔试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
    ",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
    ",ans);
    }
    
    
  • 相关阅读:
    洛谷1069 细胞分裂
    洛谷1050 循环
    CF Good Bye 2018
    洛谷1043 数字游戏
    洛谷1041 传染病控制
    洛谷1040 加分二叉树
    洛谷1039 侦探推理
    洛谷1038 神经网络
    设计模式的区别
    volatile和synchronized与lock的理解
  • 原文地址:https://www.cnblogs.com/flightless/p/14771828.html
Copyright © 2011-2022 走看看