当前位置: 首页 > news >正文

石子合并 动态规划 java_动态规划:圆形石子合并问题

问题描述:

在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。

规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。

试设计一个算法,计算出将n堆石子合并成一堆的最小得分。

import java.util.Scanner;

public class Test {

/*

* 圆形石子问题动态规划解法。

* p[i] 表示第i堆石子的个数。

* sum[i][j] 表示从第i堆石子开始,长度为j的各堆石子的总分。

* dp[i][j] 表示从第i堆石子开始,长度为j的各堆石子的最优组合的分数,即分数最小。

* 其中dp[i][1]=0;

* dp[i][j]=min(dp[i][k]+dp[(i+k-1)%n+1][j-k]+sum[i][j]),其中1<=k

*/

public static void main(String[] args){

Scanner reader = new Scanner(System.in);

int n = reader.nextInt();

int[] p = new int[n+1];

int[][] sum = new int[n+1][n+1];

int[][] dp = new int[n+1][n+1];

for(int i=1;i<=n;i++){

p[i] = reader.nextInt();//初始化每堆石子的个数

}

/**

* 初始化sum

*/

for(int i=1;i<=n;i++){

sum[i][1] = p[i];//长度为1

}

for(int j=2;j<=n;j++){

for(int i=1;i<=n;i++){

sum[i][j] = sum[i][j-1]+p[(i+j-2)%n+1];//从i开始,长度为j的石子的总数为从i开始长度为j-1的石子总数加上最后一堆石子数

}

}

/**

* 初始化dp

*/

for(int i=1;i<=n;i++){

dp[i][1] = 0;//长度为1的组合分数为0

}

for(int j=2;j<=n;j++){

for(int i=1;i<=n;i++){

dp[i][j] = Integer.MAX_VALUE;

for(int k=1;k

int temp = dp[i][k]+dp[(i+k-1)%n+1][j-k]+sum[i][j];//通过子结构求dp,长度k为划分点,在1到j之间,不包括k

dp[i][j] = Math.min(temp, dp[i][j]);

}

}

}

int minScore = dp[1][n];

for(int i=2;i<=n;i++){

minScore = Math.min(minScore, dp[i][n]);//得分最小的组合一定是从i开始,长度为n的组合,找到最小的一个组合

}

System.out.println("MINSCORE:"+minScore);

}

}

相关文章:

  • java修饰方法_Java 修饰符
  • arduino timer频率_Arduino利用TimerOne库产生固定频率和占空比的方波
  • flask数据库mysql增删查改_flask_sqlalchemy简单增删查改操作
  • java基础语法的意义_关于java基础语法的学习笔记
  • java中容器试题_Java最常见208道面试题_容器
  • java 开启线程扫描程序_当多个线程在Java中使用System.in上的扫描仪...
  • java中结构体实现_JAVA中如何实现C中的结构体数组的功能?
  • java nio close_wait_Java NIO 操作总结
  • java zmq订阅_java zmq消息队列
  • java按键数据库添加_详解Java MyBatis 插入数据库返回主键
  • java ee jdbc_JavaEE JDBC 补充注意点
  • java 返回前台excel_Java后台读取excel表格返回至Web前端
  • eclipse for java web_【Javaweb】Eclipse for JavaEE新建的Web工程自动生成web.xml
  • gopython 获取python 全局线程锁失败_python线程互斥锁递归锁死锁
  • java collections 复制_Java公开课|Java Collections类查复制操作是你学习Java的超车途径,还不来看看就晚了...
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • css布局,左右固定中间自适应实现
  • C学习-枚举(九)
  • EOS是什么
  • Golang-长连接-状态推送
  • jQuery(一)
  • markdown编辑器简评
  • Mocha测试初探
  • python docx文档转html页面
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 关于 Cirru Editor 存储格式
  • 关于List、List?、ListObject的区别
  • 和 || 运算
  • 聊聊directory traversal attack
  • 如何利用MongoDB打造TOP榜小程序
  • Java总结 - String - 这篇请使劲喷我
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • "无招胜有招"nbsp;史上最全的互…
  • #define、const、typedef的差别
  • #数学建模# 线性规划问题的Matlab求解
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (04)odoo视图操作
  • (2)MFC+openGL单文档框架glFrame
  • (Forward) Music Player: From UI Proposal to Code
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (zt)最盛行的警世狂言(爆笑)
  • (八)Spring源码解析:Spring MVC
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (转)socket Aio demo
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET6 命令行启动及发布单个Exe文件
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @KafkaListener注解详解(一)| 常用参数详解
  • [ 第一章] JavaScript 简史