只能贡献第2题给大家参考一下了。。。第一题实在想不通
package mianshi; import java.util.Scanner; public class Main2 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int n = sc.nextInt(); int k = sc.nextInt(); // 每个物品的价值 int[] num = new int[n + 1]; // 前缀和 int[] sum = new int[n + 1]; // 分割n个物品分割k次最大价值 int[][] value = new int[n+1][k+1]; // 所有车中最大的装货量,最小 int[][] zong = new int[n+1][k+1]; // 一开始没车,也没货 value[0][0] = 0; sum[0] = 0; for(int i = 1;i <= n;i++) { num[i] = sc.nextInt(); sum[i] = num[i] + sum[i-1]; } zong[0][0] = 0; for(int i = 1;i <= n; i++) { // 只有一台车,只能全装了 value[i][1] = sum[i] * sum[i]; zong[i][1] = i; } for(int che = 2; che <= k;che++) { // 枚举总共物品数 for(int j = che;j <= n;j++) { value[j][che] = 0; zong[j][che] = Integer.MAX_VALUE; for(int i = che - 1;i < j;i++) { // 假如第che号车运[i+1,j]的货 int tmp = sum[j] - sum[i]; tmp = tmp * tmp; // 剩下的由che-1号车运[1,i]的货 if( (value[i][che - 1] + tmp ) > value[j][che]) { value[j][che] = value[i][che-1] + tmp; zong[j][che] = Math.max(zong[i][che-1],j - i); } // 如果价值相等,那么看哪一种方式,某一辆车最大的运货量最小 else if((value[i][che - 1] + tmp ) == value[j][che]) { zong[j][che] = Math.min(zong[j][che],Math.max(zong[i][che-1],j - i)); } } } } System.out.println(value[n][k] + " " + zong[n][k]); } } }
全部评论
(0) 回帖