算法练习(11):牛客在线编程07 动态规划

package jz.bm;import javax.crypto.MacSpi;
import java.util.ArrayList;
import java.util.Arrays;public class bm7 {/*** BM62 斐波那契数列*/public int Fibonacci(int n) {if (n <= 2) {return 1;}int[] dp = new int[n + 1];dp[1] = 1;dp[2] = 1;for (int i = 3; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];}/*** BM63 跳台阶*/public int jumpFloor (int number) {int[] dp = new int[number + 1];dp[0] = 1;dp[1] = 1;for (int i = 2; i <= number; i++) {dp[i] = dp[i - 2] + dp[i - 1];}return dp[number];}/*** BM64 最小花费爬楼梯*/public int minCostClimbingStairs (int[] cost) {int[] dp = new int[cost.length + 1];
//        dp[1] = 0; //只有一层已经在顶楼了
//        dp[2] = 0; //两层的话选择从2楼开始for (int i = 2; i <= cost.length; i++) {dp[i] = Math.min(dp[i - 2] + cost[i - 2], dp[i - 1] + cost[i - 1]);}return dp[cost.length];}/*** BM65 最长公共子序列(二)*/public String LCS (String s1, String s2) {if (s1 == null || s1.equals("") || s2 == null || s2.equals("")) {return "";}int m = s1.length(), n = s2.length();String[][] dp = new String[m + 1][n + 1]; //dp[i][j]表示从左到右,当处理到s1的第i个元素和s2的第j个元素时的公共子序列for (int i = 0; i <= m; i++) {dp[i][0] = "";}for (int i = 0; i <= n; i++) {dp[0][i] = "";}for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (s1.charAt(i - 1) == s2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1] + s1.charAt(i - 1);} else {//取长度较长的情况dp[i][j] = dp[i - 1][j].length() > dp[i][j - 1].length() ? dp[i - 1][j] : dp[i][j - 1];}}}return dp[m][n].equals("") ? "-1" : dp[m][n];}/*** BM66 最长公共子串*/public String LCS66 (String str1, String str2) {if (str1 == null || str1.equals("") || str2 == null || str2.equals("")) {return "";}int max = 0; //每段子串都是断开的,记录最长的那一个int maxIndex = 0;int m = str1.length(), n = str2.length();int[][] dp = new int[m + 1][n + 1]; //dp[i][j]表示从左到右,当处理到s1的第i个元素和s2的第j个元素时的公共字串长度for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (str1.charAt(i - 1) == str2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1] + 1;if (dp[i][j] > max) {max = dp[i][j];maxIndex = i;}} else {dp[i][j] = 0; //无法构成字串}}}return str1.substring(maxIndex - max, maxIndex);}/*** BM67 不同路径的数目(一)*/public int uniquePaths (int m, int n) {int[][] dp = new int[m + 1][n + 1];for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {//只有一行或一列时,只有一张方法if (i == 1) {dp[i][j] = 1;continue;}if (j == 1) {dp[i][j] = 1;continue;}//只能来自于上或者右dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m][n];}/*** BM68 矩阵的最小路径和*/public int minPathSum (int[][] matrix) {int row = matrix.length;int col = matrix[0].length;int[][] dp = new int[row][col];//初值dp[0][0] = matrix[0][0];for (int i = 1; i < row; i++) {dp[i][0] = dp[i - 1][0] + matrix[i][0];}for (int i = 1; i < col; i++) {dp[0][i] = dp[0][i - 1] + matrix[0][i];}for (int i = 1; i < row; i++) {for (int j = 1; j < col; j++) {//选择值最小的路径dp[i][j] = Math.min(dp[i - 1][j] + matrix[i][j], dp[i][j] + matrix[i][j]);}}return dp[row - 1][col - 1];}/*** BM69 把数字翻译成字符串*/public int solve (String nums) {if (nums == null | "".equals(nums) || nums.startsWith("0")) {return 0;}int n = nums.length();
//        for (int i = 1; i < n; i++) {
//            if (nums.charAt(i) == '0' && !(nums.charAt(i - 1) == '1' || nums.charAt(i - 1) == '2')) {
//                return 0;
//            }
//        }int[] dp = new int[n + 1];
//        Arrays.fill(dp, 1);dp[0] = 1;  //默认一个才行dp[1] = nums.charAt(0) == '0' ? 0 : 1;for (int i = 2; i <= n; i++) {//无法独立编码也无法组合编码 00 或者 30 ,40 ...if(nums.charAt(i-1) == '0' && (nums.charAt(i-2) == '0' || nums.charAt(i-2) > '2')){return 0;//只能组合编码}else if(nums.charAt(i-1)=='0'){ //10,20dp[i] = dp[i-2];//只能独立编码}else if(nums.charAt(i-2)=='0' || nums.charAt(i-2)>'2' || nums.charAt(i-2)=='2'&& nums.charAt(i-1)>'6' ){ //0x,超过27dp[i] = dp[i-1];//两种编码方式都可以}else{dp[i] = dp[i-1]+dp[i-2];}
//            int num = (nums.charAt(i - 2) - '0') * 10 + nums.charAt(i - 1) - '0';
//            if ((num >= 11 && num <= 19) || (num >= 21 && num <= 26)) { //可以组合又可以单独译码
//                dp[i] = dp[i - 1] + dp[i - 2];
//            } else { //只能单独破译或者是10,20
//                dp[i] = dp[i - 1];
//            }}return dp[n];}/*** BM70 兑换零钱(一)*/public int minMoney (int[] arr, int aim) {int[] dp = new int[aim + 1];//初值,都设为最大值,假设货币值1元,则最大数为aim,因此可以设置为aim + 1Arrays.fill(dp, aim + 1);dp[0] = 0;for (int i = 1; i <= aim; i++) {//枚举所有的面值,找到最小值for (int j = 0; j < arr.length; j++) {if (i - arr[j] >= 0) { //当前面值可用dp[i] = Math.min(dp[i], dp[i - arr[j]] + 1);}}}return dp[aim] > aim ? -1 : dp[aim];}/*** BM71 最长上升子序列(一)*/public int LIS (int[] arr) {int m = arr.length;if (m == 0) {return 0;}int[] dp = new int[m]; //以i为结尾的最长子序列//初值都设置1,每个数字都是一个序列Arrays.fill(dp, 1);int res = 1;for (int i = 1; i < m; i++) {//遍历之前的所有数字,找到子序列for (int j = 0; j < i; j++) {//小于结尾数字,序列长度加1if (arr[i] > arr[j]) {dp[i] = Math.max(dp[i], dp[j] + 1);}}res = Math.max(dp[i], res);}return res;}/*** BM72 连续子数组的最大和*/public int FindGreatestSumOfSubArray (int[] array) {int n = array.length;int[] dp = new int[n + 1];dp[0] = 0;int max = array[0];for (int i = 1; i <= n; i++) {dp[i] = Math.max(dp[i - 1] + array[i - 1], array[i - 1]);max = Math.max(max, dp[i]);}return max;}/*** BM73 最长回文子串*/public int getLongestPalindrome (String A) {int maxlen = 1;for(int i = 0; i < A.length() - 1; i++)maxlen = Math.max(maxlen, Math.max(getPalindrome(A, i, i), getPalindrome(A, i, i + 1)));return maxlen;}public int getPalindrome(String A, int left, int right) {while (left >= 0 && right < A.length() && A.charAt(left) == A.charAt(right)) {left--;right++;}//注意:长度要减1return right - left - 1;}/*** BM74 数字字符串转化成IP地址*///递归回溯public ArrayList<String> restoreIpAddresses (String s) {ArrayList<String> res = new ArrayList<>();dfs(s, 0, res, new ArrayList<String>());return res;}private void dfs(String s, int begin, ArrayList<String> res, ArrayList<String> cur) {//找到4段IP,并且字符串遍历完毕System.out.println(cur.size());if (cur.size() == 4 && begin == s.length()) {res.add(cur.get(0) + "." + cur.get(1) + "." + cur.get(2) + "." + cur.get(3));return;}//最多需要3 * (4 - cur.size())数字,最少需要(4 - cur.size()数字if ((s.length() - begin > 3 * (4 - cur.size())) || (s.length() - begin < (4 - cur.size()))) {return;}//寻找1到3位数字,作为当前的ip段for (int i = begin; i < begin + 3 && i < s.length(); i++) {String s1 = s.substring(begin, i + 1);int num = Integer.parseInt(s1);//小于255且不能有前导0if (num >= 0 && num <= 255 && (s1.length() == 1 || s1.charAt(0) != '0')) {cur.add(s1);dfs(s,i + 1, res, cur);cur.remove(cur.size() - 1);}}}/*** BM75 编辑距离(一)*/public int editDistance (String str1, String str2) {int m = str1.length(), n = str2.length();int[][] dp = new int[m + 1][n + 1];//以i,j为结尾的字符串str1和str2,最少操作数//m为0时,str1变成str2最少操作数是str1插入字符for (int i = 1; i <= n; i++) {dp[0][i] = dp[0][i - 1] + 1;}//n为0时,str1变成str2最少操作数是str1删除字符for (int i = 1; i <= m; i++) {dp[i][0] = dp[i - 1][0] + 1;}for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {//不需要额外操作if (str1.charAt(i - 1) == str2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1];} else {//插入、删除、修改都可以dp[i][j] = Math.min(dp[i - 1][j], Math.min(dp[i][j - 1], dp[i - 1][j - 1])) + 1;}}}return dp[m][n];}/*** BM78 打家劫舍(一)*/public int rob (int[] nums) {int n = nums.length;int[] dp = new int[n + 1];dp[1] = nums[0];for (int i = 2; i <= n; i++) {//偷这家,不偷这家dp[i] = Math.max(nums[i - 1] + dp[i - 2], dp[i - 1]);}return dp[n];}/*** BM79 打家劫舍(二)*/public int rob2 (int[] nums) {int n = nums.length;int[] dp = new int[n + 1];//必须要分情况了//偷第一家,最后一家不可以偷dp[1] = nums[0];for (int i = 2; i < n; i++) {//偷这家,不偷这家dp[i] = Math.max(nums[i - 1] + dp[i - 2], dp[i - 1]);}int res = dp[n - 1];//不偷第一家Arrays.fill(dp, 0);dp[1] = 0;for (int i = 2; i <= n; i++) {//偷这家,不偷这家dp[i] = Math.max(nums[i - 1] + dp[i - 2], dp[i - 1]);}return Math.max(res, dp[n]);}/*** BM80 买卖股票的最好时机(一)*/public int maxProfit (int[] prices) {int n = prices.length;if (n == 0) return 0;int res = 0;int min = prices[0];for (int i = 1; i < n; i++) {res = Math.max(prices[i] - min, res);min = Math.min(min, prices[i]);}return res;}/*** BM81 买卖股票的最好时机(二)*/public int maxProfit1 (int[] prices) {int n = prices.length;if (n <= 1) return 0;int res = 0;for (int i = 1; i < n; i++) {if (prices[i] - prices[i - 1] > 0) {res += prices[i] - prices[i - 1];}}return res;}/****/
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/97728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kafka客户端应用参数详解

一、基本客户端收发消息 Kafka提供了非常简单的客户端API。只需要引入一个Maven依赖即可&#xff1a; <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka_2.13</artifactId><version>3.4.0</version></depend…

将python项目部署在一台服务器上

将python项目部署在一台服务器上 1.服务器2.部署方法2.1 手动部署2.2 容器化技术部署2.3 服务器less技术部署 1.服务器 服务器一般为&#xff1a;物理服务器和云服务器。 我的是物理服务器&#xff1a;这是将服务器硬件直接放置在您自己的数据中心或机房的传统方法。这种方法需…

力扣 -- 516. 最长回文子序列

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int longestPalindromeSubseq(string s) {int ns.size();vector<vector<int>> dp(n,vector<int>(n));//记得从下往上填表for(int in-1;i>0;i--){//记得i是小于等于j的for(int ji;j&l…

山体滑坡监测系统——高效、便捷的新选择

在当今社会&#xff0c;科技的进步为我们的生活和工作带来了诸多便利。而在山体滑坡监测领域&#xff0c;全球导航卫星系统&#xff08;GNSS&#xff09;的引入更是增加了数据监测的高效性和便捷性。 一、山体滑坡监测系统的基本原理 山体滑坡监测系统是由监控平台和GNSS位移…

2.6 宽带接入技术

思维导图&#xff1a; 前言&#xff1a; 我的理解&#xff1a; 1. **早期互联网接入技术的局限性**&#xff1a; - 作者首先回顾了早期用户通过电话线和调制解调器连接到互联网服务提供商&#xff08;ISP&#xff09;的方式&#xff0c;指出这种方式的速度上限是56 kbit/…

my_print_defaults 及perror

参考文档&#xff1a; https://mysql.net.cn/doc/refman/8.0/en/my-print-defaults.html https://mysql.net.cn/doc/refman/8.0/en/perror.html -- my.cnf的内容 [rootredhat762100 mysql3306]# more my.cnf [mysqld] datadir/mysql/mysql3306/data #socket/tmp/mysql3306.so…

UE5.1编辑器拓展【三、脚本化资产行为,删除无引用资产】

目录 需要考虑的问题 重定向的修复函数 代码&#xff1a; 删除无引用资产 代码 需要添加的头文件和模块 在我们删除资产的时候&#xff0c;会发现&#xff0c;有些资产在删除的时候会出现有被什么什么引用&#xff0c;还有的是没有被引用。 而我们如果直接选择一片去进行…

FFmpeg横竖版视频互换背景模糊一键生成

视频处理是现代多媒体应用中常见的需求。其中横竖版视频互换和背景模糊是视频编辑中常见的操作。FFmpeg是一个功能强大的工具,适用于这些任务。 本文将详细介绍如何使用FFmpeg进行横竖版视频互换和背景模糊。 文章目录 操作命令与命令说明横版转竖版竖版转横版背景模糊处理横…

PHP 伪协议:使用 php://input 访问原始 POST 数据

文章目录 参考环境PHP 伪协议概念为什么需要 PHP 伪协议&#xff1f; php://input为什么需要 php://input&#xff1f;更灵活的数据处理减小性能压力 发送 POST 数据HackBarHackBar 插件的获取 $_POST打开 HackBar 插件通过 HackBar 插件发起 POST 请求 基操 enable_post_data_…

ROS机械臂开发-开发环境搭建【一】

目录 前言环境配置docker搭建Ubuntu环境安装ROS 基础ROS文件系统 bugs 前言 想系统学习ROS&#xff0c;做一些机器人开发。因为有些基础了&#xff0c;这里随便写写记录一下。 环境配置 docker搭建Ubuntu环境 Dockerfile # 基础镜像 FROM ubuntu:18.04 # 设置变量 ENV ETC…

Split index API

Split index API | Elasticsearch Guide [8.10] | Elastic 当您使用Elasticsearch集群出现索引分片设置不合理&#xff08;例如索引主分片设置不合理、每个分片存在大量数据等&#xff09;引发集群性能问题时&#xff0c;可通过_split API在线扩大主分片数&#xff0c;将现有索…

[开源]基于Vue的拖拽式数据报表设计器,为简化开发提高效率而生

一、开源项目简介 Cola-Designer 是一个 基于VUE&#xff0c;实现拖拽 配置方式生成数据大屏&#xff0c;为简化开发、提高效率而生。 二、开源协议 使用GPL-2.0开源协议 三、界面展示 概览 部分截图&#xff1a; 四、功能概述 特性 0 代码 实现完全拖拽 配置式生成…

SpringBoot中常用注解的含义

一、方法参数注解 1. PathVariable 通过RequestMapping注解中的 { } 占位符来标识URL中的变量部分 在控制器中的处理方法的形参中使用PathVariable注解去获取RequestMapping中 { } 中传进来的值&#xff0c;并绑定到处理方法定一的形参上。 //请求路径&#xff1a;http://3333…

【好玩】如何在github主页放一条贪吃蛇

前言 &#x1f34a;缘由 github放小蛇&#xff0c;就问你烧不烧 起因看到大佬github上有一条贪吃蛇扭来扭去&#xff0c;觉得好玩&#xff0c;遂给大家分享一下本狗的玩蛇历程 &#x1f95d;成果初展 贪吃蛇 &#x1f3af;主要目标 实现3大重点 1. github设置主页 2. git…

C#学习系列相关之多线程(二)----Thread类介绍

一、线程初始化 1.无参数 static void Main(string[] args) {//第一种写法Thread thread new Thread(test);thread.Start();//第二种写法 delegateThread thread1 new Thread(new ThreadStart(test));thread1.Start();//第三种写法 lambdaThread thread2 new Thread(() >…

从零开始的C++(补充三的内容)

auto:在编译阶段根据数据的类型确认auto所代表的类型&#xff0c;并将auto换成对应的类型。 特点&#xff1a; 1、auto所能代表的类型必须是在编译阶段就能确认的。 2、auto修饰的变量必须初始化&#xff0c;否则编译器无法判断auto的实际类型。 3、auto会根据第一个数据来…

Java版工程行业管理系统源码-专业的工程管理软件-提供一站式服务

项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管理的提升提出了更高的要求。 二、企业通过数字化转型&#xff0c;不仅有利于优化业务流程、提升经营管理…

LeakyReLU激活函数

nn.LeakyReLU 是PyTorch中的Leaky Rectified Linear Unit&#xff08;ReLU&#xff09;激活函数的实现。Leaky ReLU是一种修正线性单元&#xff0c;它在非负数部分保持线性&#xff0c;而在负数部分引入一个小的斜率&#xff08;通常是一个小的正数&#xff09;&#xff0c;以防…

/dev下没有video0这个文件(ubuntu无法打开摄像头)

文章目录 硬件问题一、查看虚拟机摄像头连接情况二、解决红色报错三、虚拟机硬件处理内容问题一、设备号二、视频格式问题硬件问题 一、查看虚拟机摄像头连接情况 报错详情 ERROR: cannot launch node of type [image_view/image_view]: image_view ROS path [0]=/opt/ros/m…

(Note)在Excel中选中某一行至最后一行的快捷键操作

在 Excel 中&#xff0c;选中一行至最后一行的快捷键是 “Shift 空格 Ctrl 方向键下”。按住 Shift 键&#xff0c;然后按下空格键以选中整行&#xff0c;接着按下 Ctrl 键保持选中状态&#xff0c;并按下方向键下键盘按钮以扩展选中范围至最后一行。 简要步骤如下&#xf…