来来来,看看这个又臭又长的代码,以后不会有了~

  1. 不要被标签动态规划误导了,我这里就没有动态规划;而且即使把问题一般化,也不用动态规划,而直接把这个长长的代码继续加长罢了。
  2. 开玩笑,如果一般化,咱把代码也一般化,比如再嵌套一次数组,或者使用递归的形式。
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = Integer.parseInt(in.nextLine());
        String[] numStrArr = in.nextLine().split(" ");
        int[] data = new int[n];
        int[] preSum = new int[n];
        for (int i = 0; i < data.length; i++) {
            data[i] = Integer.parseInt(numStrArr[i]);
            if (i == 0) {
                preSum[i] = data[i];
            } else {
                preSum[i] = preSum[i - 1] + data[i];
            }
        }
        int total = preSum[preSum.length - 1];
        if (total % 3 != 0) {
            System.out.println(0);
            return;
        }
        int count = 0;
        int three = total / 3;
        boolean find1 = false;
        for (int i = 0; i < data.length - 2; i++) {
            int j = i;
            if (!find1) {
                while (j < data.length && data[j] <= 0) {
                    j++;
                }
                if (j < data.length) {
                    find1 = true;
                } else {
                    break;
                }
            }
            while (j < data.length && preSum[j] != three) {
                j++;
            }
            if (j >= data.length) {
                break;
            }
            i = j;
            boolean find2 = false;
            for (int k = i + 1; k < data.length; k++) {
                //第二次分割
                j = k;
                if (!find2) {
                    while (j < data.length && data[j] <= 0) {
                        j++;
                    }
                    if (j < data.length) {
                        find2 = true;
                    } else {
                        break;
                    }
                }
                while (j < data.length && preSum[j] != 2 * three) {
                    j++;
                }
                if (j >= data.length) {
                    // 没找到第二段的1/3
                    break;
                }
                k = j;
                for (int l = k + 1; l < data.length; l++) {
                    // 第三段了,不用检查第三段的和是否等于1/3了,因为一定的
                    if (data[l] > 0) {
                        count++; // 终于可以计数了,重要找到一个分割了~
                        break;
                    }
                }
                //
            }
        }
        System.out.println(count);
    }
}