文章
68
粉丝
691
获赞
26
访问
578.3k
代码有点丑见谅,拿到题可以想到,如果反转,那么我们必须翻转一个0的数目多余1的数目的子串,而且是差值越大越好,那么我们将1看作-1,0看作1,求最大连续区间和,该值就是我们最多可以通过反转再得到的1的数目,加上串中本来的1的数目就是答案
#define ll long long
#define inf 0x3f3f3f3f
#define MAX 10000007
#define vec vector<int>
#define P pair<int,int>
int main() {
string s; int n, dp[MAX], sum;
while (cin >> n >> s) {
if (n == 0) { cout << 0 << endl; continue; }
int ma = -1, v; sum = 0;
memset(dp, 0, sizeof(dp));
if (s[0] == '0')dp[0] = 1, ma = 1;
else dp[0] = -1, sum++;
//翻转0的话:等价于将0看作1,1看作-1的最大连续区间和的问题
for (int i = 1; i < n; i++) {
if (s[i] == '1')sum++, v = -1;
else v = 1;
if (dp[i - 1] > 0)dp[i] = dp[i - 1] + v;
else dp[i] = v;
if (dp[i] > ma)ma = dp[i];
}
if (ma >= 0)cout << ma + sum << endl;
else cout << sum << endl;
}
}
登录后发布评论
暂无评论,来抢沙发