马贼和金矿

题目

A、B两伙马贼意外地在一片沙漠中发现了一处金矿,双方都想独占金矿,但各自的实力都不足以吞下对方,经过谈判后,双方同意用一个公平的方式来处理这片金矿。处理的规则如下:他们把整个金矿分成n段,由A、B开始轮流从最左端或最右端占据一段,直到分完为止。

马贼A想提前知道他们能分到多少金子,因此请你帮忙计算他们最后各自拥有多少金子?(两伙马贼均会采取对己方有利的策略)

思路

  • 二维数组 dp[i][j] 表示 A 在 i 和 j 段内所能获得的最大值
  • 一维数组 sum[i] 表示 1~i 金矿质量和

动态规划方程为:

    dp[i][j] = sum[j] - sum[i-1] + Math.min(dp[i+1][j], dp[i][j-1]);

代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;

public class Main {

    static StreamTokenizer streamTokenizer = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));

    public static void main(String[] args) throws IOException {
        int T = nextInt();
        for (int j = 1; j <= T; j++) {
            int n = nextInt();
            int[] a = new int[n];
            for (int i = 0; i < n; i++) {
                a[i] = nextInt();
            }
            int[] res = solve(a);
            System.out.printf("Case #%d: %d %d", j, res[0], res[1]);
        }
    }

    static int[] solve(int[] nums) {
        int len = nums.length;
        int[] sum = new int[len + 1];
        int[][] dp = new int[len + 1][len + 1];
        sum[0] = 0;
        for (int i = 1; i <= len; i++) {
            dp[i][i] = nums[i - 1];
            sum[i] = sum[i - 1] + nums[i - 1];
        }
        for (int i = len - 1; i > 0; i--) { // 从右端开始计算
            for (int j = i; j <= len; j++) {
                dp[i][j] = sum[j] - sum[i - 1] - Math.min(dp[i + 1][j], dp[i][j - 1]);
            }
        }
        return new int[]{dp[1][len], sum[len] - dp[1][len]};
    }

    static int nextInt() throws IOException {
        streamTokenizer.nextToken();
        return (int) streamTokenizer.nval;
    }

    static long nextLong() throws IOException {
        streamTokenizer.nextToken();
        return (long) streamTokenizer.nval;
    }
}
全部评论

相关推荐

05-05 21:45
已编辑
广州大学 Java
点赞 评论 收藏
分享
06-15 02:05
已编辑
南昌航空大学 数据分析师
Eason三木:你如果想干技术岗,那几个发公众号合唱比赛的经历就去掉,优秀团员去掉,求职没用。然后CET4这种不是奖项,是技能,放到下面的专业技能里或者单独列一个英语能力。 另外好好改改你的排版,首行缩进完全没有必要,行间距好好调调,别让字和标题背景黏在一起,你下面说能做高质量PPT你得展现出来啊,你这简历排版我用PPT做的都能比你做的好。 然后自我评价,你如果要干数据工程师,抗压能力强最起码得有吧。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务