钢条切割问题——(暴力法(Brute force), Top-down DP演算法,Bottom-up DP演算法)对比

2023-11-11

注意:以下是三合一的代码,如果只想要:
暴力法(Brute force):
https://blog.csdn.net/qq_37486501/article/details/84844197
Top-down DP演算法:
https://blog.csdn.net/qq_37486501/article/details/84844222
Bottom-up DP演算法:
https://blog.csdn.net/qq_37486501/article/details/84844253

Rod Cutting题目:

在这里插入图片描述

  • 注意:
    本题采用txt文件读入,屏幕输出;
    如果需要屏幕读入屏幕输出,可以留言或者自己改代码~

暴力法(Brute force), Top-down DP演算法,Bottom-up DP演算法——(三合一代码)如下:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
class Rod{//创建Rod类,里面含有
	public int[][] extendedBottomUpCutRod(int[] prices, int n) {
        int[] revs = new int[n + 1];
        int[] size = new int[n + 1];
        revs[0] = 0;
        int max = Integer.MIN_VALUE;
        for (int j = 1; j <= n; j++) {
            max = Integer.MIN_VALUE;
            for (int i = 0; i < j; i++) {
                if (max < prices[i] + revs[j - i - 1]) {
                    max = prices[i] + revs[j - i - 1];
                    size[j] = i + 1;
                    //System.out.print(size[j]+" ");
                }
        }
            revs[j] = max;
        }
        
        //For simplicity, return a 2d array where rs[0] is the revs array, rs[1] is the size array.
        //This may not be the optimized solution but I think it's cumbersome to create a tuple class in Java so I choose to use a 2D array.
        int[][] rs = new int[2][n + 1];
        for (int i = 0; i < n + 1; i++) {
            rs[0][i] = revs[i];
            rs[1][i] = size[i];
            //System.out.print(size[i]+" ");
        }
        return rs;
    }
	 //Naive version: recursive top-down implementation
    //Time: O(2^n)
    public int cutRod(int[] prices, int n) {
        if (n == 0) {
            return 0;
        }
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < n; ++i) {
            max = Math.max(max, prices[i] + cutRod(prices, n - i - 1));
        }
        return max;
    }

    //Dynamic-programming: top-down approach with memoization
    //Time: O(n^2)
    public int memoizedCutRod(int[] prices, int n) {
        int[] revs = new int[n + 1];//revs[i] corresponds to the maximum revenues of length i. We define revs[0] = 0.
        for (int i = 0; i < revs.length; i++) {
            revs[i] = -1;//we use -1 here to indicate a state that the revs is not cached yet instead of negative infinity in the book because revenue is always nonnegative.
        }
        return memoizedCutRodAux(prices, n, revs);
    }

    private int memoizedCutRodAux(int[] prices, int n, int[] revs) {
        if (revs[n] >= 0) {
            return revs[n];
        }
        int max = Integer.MIN_VALUE;
        if (n == 0) {
            max = 0;
        } else {
            for (int i = 0; i < n; i++) {
                max = Math.max(max, prices[i] + memoizedCutRodAux(prices, n - i - 1, revs));
            }
        }
        revs[n] = max;
        return max;
    }
    
    //Dynamic-programming: bottom-up approach
    //Time: O(n^2)
    public int bottomUpCutRod(int[] prices, int n) {
        int[] revs = new int[n + 1];
        revs[0] = 0;//the revenue of a rod of length 0 is 0.
        int max = Integer.MIN_VALUE;
        for (int j = 1; j <= n; j++) {//revs[j] indicates maximum revenue of a rod of length j.
            max = Integer.MIN_VALUE;
            for (int i = 0; i < j; i++) {
                max = Math.max(max, prices[i] + revs[j - i - 1]);
            }
            revs[j] = max;
        }
        return revs[n];
    }
    
    public void printCutRodSolution(int[] prices, int n) {
        int[][] revsAndSize = extendedBottomUpCutRod(prices, n);
        int maxRevenue = revsAndSize[0][n];
        int[] size = revsAndSize[1];
        System.out.print("Cuts:");
        while (n > 0) {
            System.out.print(size[n]+" ");
            n -= size[n];
        }
        System.out.println();
        System.out.println("max revenue: "+maxRevenue);
    }
}

public class RodCutting {
    public static void main(String[] args) {
    	try {
    		FileReader in = new FileReader("p1.txt");
    		BufferedReader inin=new BufferedReader(in);//读入文件
    		 	try {
    		 		String s="";
    		 		int i=0;
    				int[] Length=new int[1000];
    				int[] prices=new int[1000];
    		 		while((s=inin.readLine())!=null)
    		 		{  
    		 		//System.out.println(s);
    		 	//将每一行分为两个整数
    		 		String []data=s.split(" ");
    		 		//System.out.println("长度"+data.length);
    		 		int [] datas=new int[data.length];
    		 		//将String类型数组转成int类型
    		 		for(int j=0;j<data.length;j++)
    		 		{ 
    		 			datas[j]=Integer.parseInt(data[j]);
    		 			//System.out.println(j+" "+data[j]);
    		 		}
//    		 		for(int i=0;i<datas.length;i++)
//    		 		{    System.out.println(i+" "+datas[i]+" ");   } 	
    		 		Length[i]=datas[0];
    		 		prices[i]=datas[1];
    		 		//System.out.println(data);
    		 		i++;
    		 		}
//    		 		for(int k=0;k<i;k++)
//    		 		{    System.out.println(k+" "+Length[k]+" ");   } //长度Length
//    		 		for(int k=0;k<i;k++)
//    		 		{    System.out.println(k+" "+Price[k]+" ");   } //价格Price
    		 		
    		 		Scanner scanner=new Scanner(System.in);
    		 		System.out.println("请输入Rod的长度: ");
    		 		int n=scanner.nextInt();
    		 		//System.out.println(Cut_Rod(Price,n));

    		        Rod rc = new Rod();
    		        int max0 =0;
		            int max1 =0;
		            int max2 =0 ;
    		        for (int i1 = 0; i1 <= n; i1++) {
    		        	 max0 = rc.cutRod(prices, i1);
    		             max1 = rc.memoizedCutRod(prices, i1);
    		             max2 = rc.bottomUpCutRod(prices, i1);    		             
//    		            System.out.printf("recursive max: %d%n", max0);
//    		            System.out.printf("memoized max: %d%n", max1);
//    		            System.out.printf("bottomUp (dp) max: %d%n", max2);
    		            //rc.printCutRodSolution(prices, i1);
    		            //System.out.println("----------------");
    		        }
    		        
    		        System.out.println("Rod Length:"+n);
		            System.out.printf("recursive max: %d%n", max0);
		            System.out.printf("memoized max: %d%n", max1);
		            System.out.printf("bottomUp (dp) max: %d%n", max2);
    		        rc.printCutRodSolution(prices, n);
//    		        rc.printCutRodSolution(prices, max0);
//		            System.out.println("----------------");
    		        
    		 	} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		} catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    }
    
}



运行成功, 截图如下:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

钢条切割问题——(暴力法(Brute force), Top-down DP演算法,Bottom-up DP演算法)对比 的相关文章

  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 如何将 pfx 文件转换为 jks,然后通过使用 wsdl 生成的类来使用它来签署传出的肥皂请求

    我正在寻找一个代码示例 该示例演示如何使用 PFX 证书通过 SSL 访问安全 Web 服务 我有证书及其密码 我首先使用下面提到的命令创建一个 KeyStore 实例 keytool importkeystore destkeystore
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 如何修复 JNLP 应用程序中的“缺少代码库、权限和应用程序名称清单属性”?

    随着最近的 Java 更新 许多人都遇到了缺少 Java Web Start 应用程序的问题Codebase Permissions and Application name体现属性 尽管有资源可以帮助您完成此任务 但我找不到任何资源综合的
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • 生产环境诊断利器 WinDbg 帮你快速分析异常情况 Dump 文件

    一 简介 生产环境偶尔会出现一些异常问题 WinDbg 或 GDB 就是解决此类问题的利器 调试工具 WinDbg 如同医生的听诊器 是系统生病时做问题诊断的逆向分析工具 Dump 文件类似于飞机的黑匣子 记录着生产环境程序运行的状态 本文
  • 王道快速排序和归并排序的完整代码

    这是快排的代码要作为模板背下来 include
  • 唐诗

    作者 楚予微茫 链接 https zhuanlan zhihu com p 79798355 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 送杜少府之任蜀州 王勃 城阙辅三秦 风烟望五津 与君离别意 同是宦
  • Android---ImageSpan + SpannableStringBuilder 图文混排解决表情文字高度不一致排版错乱问题(设置padding 行间距依然生效)

    文章目录 前言 一 继承ImageSpan重写绘制方法 二 实践 前言 android图文混排的最常见实现方案就是使用SpannableStringBuilder 比如我们要实现聊天框输入表情的功能就需要用到其实现 但是当我们的icon图标
  • Java多重循环

    一 多重循环的理解 1 多重循环指一个循环语句的循环体中再包含循环语句 又称嵌套循环 2 循环语句内可以嵌套多层循环 3 不同的循环语句可以相互嵌套 语法格式 while 循环条件1 循环语句1 while 循环条件2 循环语句2 do 循
  • 分享人工智能方向优质技术博客

    Machine learning Blogs 想要阅读更多关于人工智能技术博客 请关注微信公众号 人工智能大讲堂 专注人工智能底层数学原理和应用 专栏包括线性代数 概率统计 机器学习 深度学习 线性代数博客汇总 线性代数博客合集 线性代数本
  • 激光雷达Velodyne VLP16在ROS下的使用

    Velodyne VLP16在ROS下的使用 前置条件 Ubuntu 16 04 激光雷达VLP16 ROS kinetic 使用步骤 基础设置 安装驱动 sudo apt get install ros kinetic velodyne
  • 蓝桥杯国赛C++A组B组题解整理(第八、七、六、五、四届)

    写在前面的话19 04 04 今年省赛的结果出的意外得快 有很多小伙伴来和我分享他们进了省一的喜悦 并问我啥时候更新国赛题解 emmm 不是我不想更新 实在是抽不出时间 有缘再更 虽然不更新题解 但是我决定这次提前写一点注意事项吧 省得大家
  • java 24点游戏

    24点纸牌游戏 一 内容 二 步骤 1 算法分析 2 概要设计 3 测试 4 调试 5 心得体会 一 内容 24点游戏是经典的纸牌益智游戏 常见游戏规则 从扑克中每次取出4张牌 使用加减乘除 第一个能得出24者为赢 其中 J代表11 Q代表
  • 分享一个效果很好的ddos压力测试服务网站

    分享一个经测试效果好的ddos压力测试网站 打开网站 http www akddos com 免费注册一个账户即可测试 udp流量最高400G 支持SYN CC DNS等多种模式 套餐自由选择 效果很好 大家可以去试试 网站主要是用来测试自
  • 给定一个整数数组,判断是否存在重复元素。

    存在重复元素 给定一个整数数组 判断是否存在重复元素 如果存在一值在数组中出现至少两次 函数返回 true 如果数组中每个元素都不相同 则返回 false 示例 1 输入 1 2 3 1 输出 true 作者 力扣 LeetCode 链接
  • html动态爱心代码【三】(附源码)

    目录 前言 特效 内容修改 完整代码 总结 前言 七夕马上就要到了 为了帮助大家高效表白 下面再给大家带来了实用的HTML浪漫表白代码 附源码 背景音乐 可用于520 情人节 生日 表白等场景 可直接使用 特效 内容修改 文字区 div h
  • 反卷积层(转置卷积)

    反卷积 deconvolution 不是数字信号处理里面的意义 在深度学习里面应该叫做转置卷积 transposed convolution 又名微步卷积 fractionally strided convolutions 也有叫Backw
  • Qt5开发学习总结(三)——窗口部件的使用(QWidget和QDialog)

    窗口部件 QT提供的默认基类只有QMainWindow QWidget 和QDialog这三种 这三种窗体也是用的最多的 QMainWindow是带有菜单栏和工具栏的主窗口类 QDialog是各种对话框的基类 而他们全部继承自QWidget
  • 力扣简单题合集(带答案)

    1 给定一个整数数组 nums 和一个目标值 target 请你在该数组中找出和为目标值的那 两个 整数 并返回他们的数组下标 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素不能使用两遍 class Solution publi
  • [leetcode 周赛 149] 1155 掷骰子的N种方法

    目录 1155 Number of Dice Rolls With Target Sum 掷骰子的N种方法 描述 思路 代码实现 1155 Number of Dice Rolls With Target Sum 掷骰子的N种方法 描述 这
  • Windows下安装MySQL(详解)

    Windows下安装MySQL MySQL8 0下载链接 https pan baidu com s 1w2TcLGel51jJwJerQneVjg pwd zzkt 提取码 zzkt 也可以选择在官网上下载 1 在百度 其他浏览器也可以
  • Windows环境下nacos的下载与安装

    一 nacos的下载地址 https github com alibaba nacos 根据自己项目配置的版本 下载对应的nacos客户端 windows下载zip安装包 linux下载tar gz包 二 下载解压成功后 修改配置文件D n
  • 达梦中Hibernate的Save问题

    业务逻辑 在原有数据源是mysql的基础上适配达梦时 使用Hibernate的save方法进行保存 save保存后会返回自增主键id的数值 再根据这个返回值来进行updateorsave更新操作 某字段为主键id值 固定字符组成 问题 返回
  • 钢条切割问题——(暴力法(Brute force), Top-down DP演算法,Bottom-up DP演算法)对比

    注意 以下是三合一的代码 如果只想要 暴力法 Brute force https blog csdn net qq 37486501 article details 84844197 Top down DP演算法 https blog cs