题目描述

给定 n 个整数组成的序列,将序列分割为 m 段,如何分割才能使这 m 段子序列的和的最大值达到最小?

题解

  • 状态表示 dp[i][j]表示前i个元素划分j段 子序列和的最大值的最小值
  • 状态转移 dp[i][j]=min{dp[i][j], max{dp[k][j-1],dp[i][1]-dp[k][1]}},其中前k个元素是前j-1段,k+1到末尾是最后一段。
  • 初始化 dp[i][1]=对应子数组原始元素和

todo

for循环的终止条件还有需继续思考为什么不是注释的?或者换成注释要改哪里。

代码

public class Main {
public static void main(String args[]) {
int[] arr= {9,8,7,6,5,4,3,2,1};
int m=3;
int minMaximum=minMaxMSegSum(arr,m);//9,8/,7,6/,5,4,3,2,1
System.out.println(minMaximum);
} public static int minMaxMSegSum(int arr[],int m) {
int[][] dp=new int[arr.length+1][m+1];
int sum=0;
for(int i=0;i<arr.length;++i) {
sum=sum+arr[i];
dp[i+1][1]=sum;
}
for(int i=2;i<arr.length+1;++i) {//
for(int j=2;j<=m&&j<=i;++j) {//
dp[i][j]=Integer.MAX_VALUE;//
for(int k=1;k<i;++k) {//&&j-1<=k?
dp[i][j]=Math.min(dp[i][j], Math.max(dp[k][j-1],dp[i][1]-dp[k][1]));//
}
}
}
return dp[arr.length][m];
}
}

最新文章

  1. loadRunner 负载机连接错误分析
  2. Unity中Mesh分解与边缘高亮加上深度检测
  3. Debugging JTAG Connectivity Problems
  4. asp防注入安全问题
  5. JavaScript(19)jQuery HTML 获取和设置内容和属性
  6. 【排序】表插入排序算法(C语言版)
  7. 【转】使用 udev 高效、动态地管理 Linux 设备文件
  8. C++细节系列(零):零散记录
  9. HDU - 5234 Happy birthday
  10. Rsync服务
  11. Nginx集群之.Net打造WebApp(支持IOS和安卓)
  12. CSS实现网页背景图片自适应全屏
  13. 随手科技(随手记)2017招聘Java工程师笔试题
  14. vue $mount 和 el的区别
  15. Squid.conf配置详情
  16. Oracle&#160;win32_11gR2_database在Win7下的安装与卸载
  17. DeBruijin HDU - 2894(????????)
  18. 安卓——implements——OnClickListener
  19. Object.create() 创建实例对象
  20. 关于内存类型 UDIMM、RDIMM、LRDIMM 的学习结论(转)

热门文章

  1. Elasticsearch聚合语句
  2. PAT 2-08. 用扑克牌计算24点(25):
  3. cdh6.2.1搭建安装
  4. 【Net】StreamWriter.Write 的一点注意事项
  5. Jmeter 常用函数(28)- 详解 __FileToString
  6. 5 个 Git 工作流,改善你的开发流程
  7. 介绍 golang json数据的处理
  8. log4j升级到log4j2
  9. 水滴app
  10. 记录一次mybatis缓存和事务传播行为导致ut挂的排查过程