题解 | 小美的01串翻转

小美的01串翻转

https://www.nowcoder.com/practice/a0effc0e1dd24412a8f47c5dde0da075

首先,他说我们要一个相邻字符不相等的01串,那么我们首先知道我们的目标就是变成101010……的形式或者010101……的形式。

然后我们数据范围是2000,这意味着我们可以使用O(n²)的时间复杂度来解决这道题,而我们的目标是求解所有连续子串的权值和。如果是纯暴力,那么我们就需要遍历做右端点,然后再跑一遍这个区间,计算它和我们前面的那两种形式相差的最小值,就是这个区间的权值

很明显这样子暴力会超时。所以我们考虑优化方式。这里很容易想到使用dp的方式,然后聪明的你考虑dp的时候就很容易想到,对于[i,j]区间的权值和,其实我们可以由[i,j -1]递推过来。

所以这里我们就能得到dp[len][i][j]表示以i为左端点,区间长度为len,对于最开始提到的第j中形式来说,和当前区间子串差了多少.然后区间子串的权值就是min(dp[len][i][0],dp[len[i][1])

以下是参考代码:

//               BggBB                wZPXsv:.         UBgQGv
//               BgEQQ            ,:sJ.    .,.  ::,    rBORZJ
//              .BgggB   .sJrc7r77:.,          .:;75as :BgOMp
//              :BgERB. 2a:          ,:.             :cEBOgMB:
//       wR:    rBODgBKL:  ,:r:     ,srLL;.        .   ,BRggBJ ;       s
//       gR1    sBgDBQi  :csLr;         ,rJ7.       ,,  BMp5QQJ;w:   :rg,
//   JRJipEs    XBRBO   7s;,               :c;        .,BE5OgB  :7L    L
//    cZQDB:    RBBP  :L;.                   :r         GBBEgQ5 .;:w
//       ..    ;DBZ  r7.         ............ :r         rBBpgBr  i.w.
//            pBBR  r;      ........,.....,....:r .        BBGEOZ  r w,
//           BQBB  :,      ..,:.................i:.,.       gBQB6B1;r 5:
//           5BB       ..:,...;.......,.,........:.     .QL  ZBRMXBB,. X.
//            B.     ... 7r ..:,...,.,....:: ....:,.XQr;BBB   EBGMB.    L
//         ,DB:     ..,. :L   ,r  ,.,.,.. :B: ....: 1BHKBQB;   RBgMES:
//     2   GB:   .  ,,.. rg  . w;.........:X2;.::::.    ,SE,    BBRBQBa
//     ;   77,  . .,,... 7S,...,5...,.,.. ;7 1: ..::...     ,.  .BMEGB:
//        sr;R . ..,.... U:S ...rr.....,. s; .Jr  .,.........,.  2QSgr ..
//       K2 X:   ,,.,.:::2 1; ..,::.......X    ri  ....,,.....,.  BJM  ..
//     ,Q7  Q   .,....c;.L .5  ..,...,.. cr .:ri2a   . ;r..,.,.,  P:P:,
//    ;H.  ra  .,.,.. H7:;  ,c   .,,,,,.:U RBBBBBBB:,. .r ....,,  r:p,;r
//         G: .i.... :s::r;2pBL:; .,,,..K. Bss5L7LEMJvrr;...:..,  ,pZ :X:
//         M  .::... 7:.7QBBBBBKBr.....sr    w:,  ,:6.r;,..::.,.  :5:  :Z
//         Q ...i,.. 1sBO::U;; :rvr:::cr     6 :HS, p  X. :;....  :U L  :
//         O ...,r.  BBP  77..,r;c .LS:      w; r;  H  1 ,;....., rJ;H
//         g ....,i, OS   ,X..7HrL   :        1r..:s. L:,;....,:. K2:.L
// .:i;:, .g  .....:;sES   L7 .,,7             ,. ,  r;,:.,..::. iE;: s.
// ;.  .ss:M; :..,...v:17   ;7,.:.  .              .7;.,.. ;7: .rD,:i; 2
//   ,.   : G:6r. ... ;7g.                       rJi:.  ,:J1:.r2,rr::v ;,
//   7v7: ;.7:7UP2i:,:rr,7          .. .::         rJrrcJsc: L;L: J;::7 r
// i....:visP.27rLJLU5r;css         ,.            ,5s,c;:,r. c..c  7;,v,
// : ,. i, ,RO.:       .E;Hw,                   .DBH7;r7.:i  X5LLU. .. r
// , ...BU.  .w:;r1r    .sr,vc:               .pBREDQBBL.;:  QBBBBBXXP7.
// , , :QBB1 ;:7v:vJ:    Jv.i1EgBgJi,     .,::.gDZKPHGBs,;  .BQMDU5GQBBB7
// , .. LDr 7rLLL,U,r.   cDQBQBRGERQBBQ,:;r7s2PDRZZpEDBL,., ,BRpZZZZOOgB7
// , .:. . DQK.r.7; r.   :gBDZpZPEpZ6gMa6RMBBQgEKZ6DDMBr,..::BEZpEGDZPPG
//   si,: :2QBac;..,r     PQgPPPEZOZDGDRRDDEGpZpOOgORBH,: ..:Qg6ZZp2JsO;
//  Q: :J7 7      .,.     6RQQDD6ZpZpZ6Z6ZpZ6gOgDOGRDR  :.  .MMOpX52UKDr
// BB7 1  .:UMOPXr        gQgEgDDZZpE6E6Z6ZPZGOpDRDUSOEHBBL  7BRP5HXXXDJ.
// GXB1  .: UBMQBBg       JB6pKpPG6O6G6EZEpEPp6MGSwPEDRQgMBP  :RPXUX6PQa;
// gXOR .,,pgGE6ODBB,      QQOZ6RMBBBQMgDZZ6ZGE21HOEZpEpEZgB,  :ZZppBQs,v
// gwXBr,;EBEEpGZGGBQ:     .RMgK7r:::i7s1HPZHDHLEGPpKpK6PpZBs .D;g6GMZ  ;

#include<bits/stdc++.h>

using namespace std;

#define int long long
#define ll long long
#define lowbit(x) x&(-x)

const int MOD=1e9 + 7;
const int N=1e6+10;

int qpow(int num,int k) {
    int res=1;
    while(k) {
        if(k%2) res = (res * num) % MOD;
        num = (num * num) % MOD;
        k/=2 ;
    }
    return res % MOD;
}

int inv(int x) {
    return qpow(x,MOD-2);
}
 
int lcm(int x,int y) {
    return x * y / __gcd(x,y);
}

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int Base = uniform_int_distribution<>(8e8,9e8)(rng); 

int a[N];
int b[N];

int dp[2020][2020][3];//0表示101010……的权值,1表示010101……的权值

void solve() {
    string s;
    cin>>s;

    string t1,t2;

    int n = s.length();

    for(int i=1;i<=n;i++){
        if(i % 2) t1.push_back('1'),t2.push_back('0');
        else t1.push_back('0'),t2.push_back('1');
    }

    int res = 0;
    for(int i=1;i<=n;i++){
        if(s[i - 1] == '1') dp[i][1][0] = 0,dp[i][1][1] = 1;
        else dp[i][1][0] = 1,dp[i][1][1] = 0;
    }

    for(int len=2;len<=n;len++){
        for(int i=1;i + len - 1<=n;i++){
            int j = i + len - 1;

            dp[i][len][0] = dp[i][len - 1][0] + (s[j - 1] != t1[len - 1]);
            dp[i][len][1] = dp[i][len - 1][1] + (s[j - 1] != t2[len - 1]);

            //cout<<i<<" "<<j<<" "<<dp[i][len][0]<<" "<<dp[i][len][1]<<"\n";

            res += min(dp[i][len][0],dp[i][len][1]);
        }
    }

    cout<<res<<"\n";
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int t=1;
    // cin>>t;

    while(t--) {
        solve();
    }
    return 0;
}

全部评论

相关推荐

04-08 21:39
已编辑
Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务