翻转后1的数量(dp)
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);}
}
最大子段和问题