2.6-Java提高组 蓝桥算法训练营

Feishi11 2023-02-06 20:20:44

石子合并:区间dp模板题



import java.util.Scanner;

public class Main{
    static final int N = 210;
    static final int INF = Integer.MAX_VALUE;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int nn = sc.nextInt();
        int n = nn << 1;
        int[] a = new int[n + 1];
        int[][] dpmin = new int[N][N];
        int[][] dpmax = new int[N][N];
        //因为题目说是环形的所以在原来的模板上改成链形的
        for (int i = 1; i <= nn; i++) {
            a[i] = sc.nextInt();
            a[i + nn] = a[i];
        }
        for (int i = 1; i <= n; i++) {
            a[i] += a[i - 1];
        }
        for (int i = 1; i < nn; i++) {
            for (int j = 1; j <= n - i; j++) {
                int mid = i + j;
                dpmin[j][mid] = INF;
                for (int k = j; k < mid; k++) {
                    int sum = a[mid] - a[j - 1];
                    dpmin[j][mid] = Math.min(dpmin[j][mid], dpmin[j][k] + dpmin[k + 1][mid] + sum);
                    dpmax[j][mid] = Math.max(dpmax[j][mid], dpmax[j][k] + dpmax[k + 1][mid] + sum);
                }
            }
        }
        int max = -INF, min = INF;
        for (int i = 1; i <= nn; i++) {
            max = Math.max(max, dpmax[i][i + nn - 1]);
            min = Math.min(min, dpmin[i][i + nn - 1]);
        }
        System.out.println(min + "\n" + max);
    }
}

三步必杀:差分,前缀和

//计算完两次差分两次前缀和求出xor max
import java.io.*;

public class Main {
    static int N = (int) (1e7 + 10);
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
    public static void main(String[] args) throws IOException {
        String[] ss = br.readLine().split(" ");
        int n = Integer.parseInt(ss[0]);
        int m = Integer.parseInt(ss[1]);
        long[] c = new long[N];
        for (int i = 1; i <= m; i++) {
            ss = br.readLine().split(" ");
            int l = change(ss[0]), r = change(ss[1]), s = change(ss[2]), e = change(ss[3]);
            int C = (e - s) / (r - l);
            c[l] += s;
            c[l + 1] += C - s;
            c[r + 1] -= C + e;
            c[r + 2] += e;
        }
        long[] b = new long[N];
        long max = 0, xor = 0;
        for (int i = 1; i <= n; i++) b[i] = b[i - 1] + c[i];
        for (int i = 1; i <= n; i++) {
            b[i] += b[i - 1];
            xor ^= b[i];
            max = Math.max(b[i], max);
        }
        out.println(xor + " " + max);
        out.flush();
        br.close();
        out.close();
    }

    static int change(String s) {
        return Integer.parseInt(s);
    }
}

其他不会太弱了

...全文
32 回复 打赏 收藏 举报
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复
发帖
高校算法学习社区

4.2w+

社区成员

和众多高校算法内卷分子,一起学习和交流算法那。浓郁的算法交流氛围,拒绝躺平,有效内卷。加入我们,私信我拉你入核心内卷群。
算法数据结构leetcode 个人社区
社区管理员
  • 执 梗
  • Dream-Y.ocean
  • ღCauchyོꦿ࿐
加入社区
帖子事件
创建了帖子
2023-02-06 20:20
社区公告

 刷题!