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);
    }
    
    
  • 相关阅读:
    C# 批量图片合并工具(附源代码)
    C# 封装
    SQL语句基础
    c# My计算器源码
    炸酱面
    烧茄子
    Linux Desktop Entry 文件深入解析
    硬盘安装ubuntu
    使用C语言进行面向对象的开发--GObject入门[2]
    GObject对象系统 (1)
  • 原文地址:https://www.cnblogs.com/flightless/p/14771828.html
Copyright © 2011-2022 走看看