
java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String s = sc.next();
int cnt1 = 0; // 原本1的个数
int[] gain = new int[n + 1];
// 构造gain数组
for (int i = 1; i <= n; i++) {
if (s.charAt(i - 1) == '1') {
cnt1++;
gain[i] = -1; // 翻转会减少一个1
} else {
gain[i] = 1; // 翻转会增加一个1
}
}
// DP数组
int[] dp = new int[n + 1];
dp[1] = gain[1];
int maxGain = dp[1];
// 动态规划求最大子段和
for (int i = 2; i <= n; i++) {
dp[i] = Math.max(gain[i], dp[i - 1] + gain[i]);
maxGain = Math.max(maxGain, dp[i]);
}
System.out.println(cnt1 + maxGain);
}
}
最大子段和问题