【动态规划】最大K乘积问题和游艇租用问题——武汉理工大学算法设计与分析课程实验
1. 最大K乘积问题
« 问题描述
设I是一个n位十进制整数。如果将I划分为k段,则可得到k个整数。这k个整数的乘积称为I的一个k乘积。试设计一个算法,对于给定的I和k,求出I的最大k乘积。
例如十进制整数 1234 划分为 3 段可有如下情形:
1 × 2 × 34 = 68
1 × 23 × 4 = 92
12 × 3 × 4 = 144
« 编程任务
对于给定的I 和k,编程计算I 的最大k 乘积。
« 数据输入
输入的第1 行中有2个正整数n和k。正整数n是序列的长度;正整数k是分割的段数。接下来的一行中是一个n位十进制整数。(n<=10)
« 结果输出
计算出的最大k乘积。
输入文件示例 |
输出文件示例 |
input.txt |
output.txt |
3 2 312 |
62 |
2. 游艇租用问题:
问题描述
长江游艇俱乐部在长江上设置了n个游艇出租站1,2,…,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i到游艇出租站j之间的租金为r(i,j),1£i<j£n。试设计一个算法,计算出从游艇出租站1到游艇出租站n所需的最少租金。
编程任务
对于给定的游艇出租站i到游艇出租站j之间的租金为r(i,j),1£i<j£n,编程计算从游艇出租站1到游艇出租站n所需的最少租金。
数据输入
由文件input.txt提供输入数据。文件的第1行中有1个正整数n(n<=200),表示有n个游艇出租站。接下来的n-1行是r(i,j),1<=i<j<=n。
(例如:
3
5 15
7
表示一共有3个出租站点,其中
第1个站点到第2个的租金为5
第1个站点到第3个的租金为15
第2个站点到第3个的租金为7
)
结果输出
程序运行结束时,将计算出的从游艇出租站1到游艇出租站n所需的最少租金输出到文件output.txt中。
输入文件示例 |
输出文件示例 |
input.txt |
output.txt |
3 5 15 |
12 |
7 |
|
input.txt |
output.txt |
4 |
15 |
3 7 19 |
|
5 13 |
|
8 |
实现源码:
import java.io.*;
public class Main{public static void main(String[] args){K();least();}public static void K(){/*num[n]存放数字m[i][j]表示前i个元素分为j段m[i][j] = Max(m[k][j-1]*num[k:i])*/ try{//数据初始化BufferedReader fr=new BufferedReader(new FileReader("file//input_2.txt"));String[] firstLine = fr.readLine().split(" ");int n = Integer.parseInt(firstLine[0]);int k = Integer.parseInt(firstLine[1]);String[] secondLine=fr.readLine().split("");int[] num = new int[n+1];for(int i=1;i<=n;i++){num[i] = Integer.parseInt(secondLine[i-1]);}//结果数组m初始化int[][] m = new int[n+1][n+1];m[1][1] = num[1];for(int i=2;i<=n;i++){//初始情况,分为1段时m[i][1] = m[i-1][1]*10 + num[i];}//进行分段for(int part=2; part<=n; part++){//分为part段,最多即n段for(int len=part; len<=n; len++){//更新m[len][part]int max = 0;for(int median=1; median<len; median++){//寻找中间值median,寻找m[len][part]的最大值int value = m[median][part-1]*sum(num,median+1,len);max= max>value ? max : value;}m[len][part] = max;}}fr.close();//将结果写入文件FileWriter fw = new FileWriter(new File("file//output_2.txt"));fw.write(String.valueOf(m[n][k]));fw.close();}catch(Exception e){System.out.println(e);}}public static int sum(int[]num,int i,int j){//求数组num第i位到第j位的和int result=0;for(int k=i;k<=j;k++){result += num[k];}return result;}public static void least(){try{BufferedReader fr = new BufferedReader(new FileReader("file/input.txt"));int len = Integer.parseInt(fr.readLine());//出租点编号为0到len-1号//到各点的最小开销int[] cost = new int[len];for(int i=0;i<len;i++){cost[i] = i==0 ? 0 : 0Xffff;}//为距离数组赋值int[][] num = new int[len][len];for(int i=0;i<len-1;i++){String[] str = fr.readLine().split(" ");for(int j=0;j<str.length;j++){num[i][i+1+j] = Integer.parseInt(str[j]);}}//len-1次循环,逐步向后更新到每个点的最小开销for(int i=0;i<len-1;i++){//根据第i个点到后面点的距离,更新最短距离for(int j=i+1;j<len;j++){if( cost[j] > cost[i]+num[i][j] ){cost[j] = cost[i]+num[i][j];}}}fr.close();FileWriter fw = new FileWriter(new File("file//output.txt"));fw.write(String.valueOf(cost[len-1]));fw.close();}catch(Exception e){System.out.println(e);}}}
【动态规划】最大K乘积问题和游艇租用问题——武汉理工大学算法设计与分析课程实验相关推荐
- 算法设计与分析:动态规划(3)-序列联配问题(以算代存)
文章目录 前言 高级动态规划 应用分治思想减少空间 计算得分 从后缀匹配到前缀匹配 伪代码 分治点计算改进 总结 本文参考UCAS卜东波老师算法设计与分析课程撰写 前言 本文内容承接上一次算法设计与分 ...
- 算法设计与分析——动态规划(二):钢条切割
分类目录:<算法设计与分析>总目录 相关文章: · 动态规划(一):基础知识 · 动态规划(二):钢条切割 · 动态规划(三):矩阵链乘法 · 动态规划(四):动态规划详解 · 动态规划( ...
- 算法设计与分析-----动态规划
算法设计与分析-----动态规划(c语言) 一.动态规划 1.定义 2.动态规划问题的解法 3.动态规划求解的基本步骤 4.动态规划与其他方法的比较 5.求解整数拆分问题 6.求解最大连续子序列和问题 ...
- 算法设计与分析——动态规划(五):最长公共子序列
分类目录:<算法设计与分析>总目录 相关文章: · 动态规划(一):基础知识 · 动态规划(二):钢条切割 · 动态规划(三):矩阵链乘法 · 动态规划(四):动态规划详解 · 动态规划( ...
- 动态规划|最大k乘积问题(C语言)
题目: [分析] 先通过若干个简单例子来观察规律,摸索思路.例如十进制整数 1234 划分为 3 段可有如下情形: 1 × 2 × 34 = 68 1 × 23 × 4 = 92 12 × 3 × 4 ...
- 算法设计与分析——动态规划(一)矩阵连乘
动态规划--Dynamic programming,可以说是本人一直没有啃下的骨头,这次我就得好好来学学Dynamic programming. OK,出发! 动态规划通常是分治算法的一种特殊情况,它 ...
- 程振波 算法设计与分析_算法分析与设计之动态规划
动态规划同样是一种将问题分解为求解子问题的方法,不过与分治不同的是,动态规划算法的子问题不是相互独立的,而是有公共的部分,即有重叠子问题,这个时候使用分治算法,将会重复计算公共的子问题,效率很低!而用 ...
- 算法设计与分析 实验四 动态规划求解流水线问题
动态规划求解流水线问题 一.实验目的与要求 1. 实验目的: 2. 实验亮点: 二.实验内容与方法 1. 实验内容: 2. 实验要求: 三.实验步骤与过程 (一)暴力穷举法 1.算法描述: 2.时间复 ...
- 计算机算法设计与分析 租用游艇问题
长江俱乐部在长江设置了n个游艇出租站1,2,-n,游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇.游艇出租站i到游艇出租站j之间的租金为r(i,j), 设计一个算法,计算出从出租 ...
最新文章
- Python3中raise用法
- python 在windows 中文显示
- python处理excel视频-从零基础开始用Python处理Excel数据 视频教程
- beego 文件服务器,beego自动化文档
- [转]对C#泛型中的new()约束的一点思考
- 三极管稳压管组成的线性电源关键理解
- 云智视像 | 内推两个年薪可达70万+的CV算法职位~base杭州上海
- 华为三星和解;联想全球首发折叠电脑;苹果回应美高院裁决 | 极客头条
- php mysql中华图书购物商城
- Android中JNI 的一些常用说明 JNI_OnLoad registerNatives registerNativeMethods
- 使用timerfd实现定时器功能
- 【Pix4d精品教程】Pix4d模型成果导出OSGB并加载OSGB到EPS进行三维测图完美案例教程
- vs2010注册码 激活方法
- 论文常用图表三:盒图 Boxplot【MATLAB】
- 怎样打印计算机桌面,敬业签电脑桌面便签软件怎么打印便签内容?
- 研究Google maps及51ditu的图片切割及存储方法(转)
- 计算机专业必读哪些经典书籍?
- 折腾黑苹果 - 制作四叶草CLOVER引导U盘
- 2022-2027年中国心血管病医院行业市场深度分析及投资战略规划报告
- win7计算机搜索功能没有了,win7搜索功能不能用了怎么办|win7搜索功能不见了怎么解决? - 学无忧...