P5650

· · 题解

Ansel又双叒叕的来发题解了

Ansel这几天疯狂再写DP所以看啥都像DP

OK废话不多说直接进入正题【捂脸】

Idea:

  1. 如果下一个字符是 0 的话直接添加(不解释
  2. 下一个字符如果为 1 ,那么就考虑添加该点则最高子串的值减小1,与不添加该点进行对比选取最大
  3. 千万记住进行特判如果全为1的话,那么就是0 - 1 = -1,最终结果为-1

    最后献上AC代码

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    int const maxn = 1e5+10;
    string str;
    int a[maxn];
    int main() 
    {
    int flag = 0;
    int ans = -999;
    cin >> str;
    int len = str.length();
    for (register int i = 0; i < len; i++)
    {
        if (str[i] == '0') a[i] = a[i-1] + 1;
        else a[i] = max(a[i-1]-1,a[i]);
    
    }
    for (register int i = 1; i <= len; i++)
    {
        if (a[i] > ans ) ans = a[i];
    }
    for (register int i = 0; i < len; i++)
    {
        if (str[i]=='1') flag++;
    }
    if (flag == len)
    {
        cout << "-1" <<endl;
        return 0;   
     } 
    cout << ans << endl;
    }

    如果Ansel有不对的地方,或没有解释清楚的地方,欢迎留言与大家一起进步!

    Ps: 溜了溜了orz