zoukankan      html  css  js  c++  java
  • D1. Kirk and a Binary String (easy version)

    D1. Kirk and a Binary String (easy version)

    01串找最长不降子序列

    给定字符串s,要求生成一个等长字符串t,使得任意l到r位置的最长不降子序列长度一致

    从后往前暴力枚举,枚举每个一替换成0后是否改变了l到r位置的最长不降子序列长度

    01串的最长不降子序列,可以通过线性dp求解

    dp i表示以i结尾的最长不降子序列长度

    dp[0]=dp[0]+s[i]=='0';

    dp[1]=max(dp[0],dp[1])+s[i]=='1';

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    #define sc(x) scanf("%I64d",&(x));
    typedef long long ll;
    #define maxn 2005
    
    #define INF 1e18
    ll N;
    ll val[2][maxn];
    ll dp[2];
    void LIS(string s,int st,int  val[])
    {
        dp[0]=dp[1]=0;
        for(int i=st;i<N;i++){
            if(s[i]=='0'){
                dp[0]++;
            }else dp[1]=max(dp[0],dp[1])+1;
            val[i]=max(dp[0],dp[1]);
        }
    
    }
    signed main()
    {
        string s,t;
        cin>>s;
        N=s.size();
        t=s;
        //int len=0;
        for(int i=N-1; i>=0;i--)
        {
            if(s[i]=='1')
            {
                t[i]='0';
                LIS(s,i,val[0]);
                LIS(t,i,val[1]);
                for(int j=i;j<N;j++){
                    if(val[0][j]!=val[1][j]){
                        t[i]='1';
                        break;
                    }
                }
            }
        }
        cout<<t<<'
    ';
    }

     下面这个大概思路是从后往前枚举,后面的0个数比1个数小时,可以删当前位置1

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    #define sc(x) scanf("%I64d",&(x));
    typedef long long ll;
    #define maxn 2005
     
    #define INF 1e18
    ll N;
    ll val[2][maxn];
    ll dp[2];
    void LIS(string s,int st,int  val[])
    {
        dp[0]=dp[1]=0;
        for(int i=st;i<N;i++){
            if(s[i]=='0'){
                dp[0]++;
            }else dp[1]=max(dp[0],dp[1])+1;
            val[i]=max(dp[0],dp[1]);
        }
     
    }
    signed main()
    {
        string s,t;
        cin>>s;
        N=s.size();
        t=s;
        int cnt=0;
        for(int i=N-1; i>=0;i--)
        {
           if(s[i]=='0'){
             cnt++;
           }else if(cnt==0&&s[i]=='1'){
               t[i]='0';
           }else cnt--;
        }
        cout<<t<<'
    ';
     
    }
  • 相关阅读:
    第二十一天作业
    第二十天:继承
    第二十天作业
    第十六天
    第十九天作业
    day53
    day52
    day51
    day50
    day44
  • 原文地址:https://www.cnblogs.com/liulex/p/11386740.html
Copyright © 2011-2022 走看看