代码随想录leetcode200题之动态规划算法

2024-06-02 02:28

本文主要是介绍代码随想录leetcode200题之动态规划算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1 介绍
  • 2 训练
  • 3 参考

1 介绍

本博客用来记录代码随想录leetcode200题之动态规划算法相关题目。

2 训练

题目1:509. 斐波那契数

C++代码如下,

class Solution {
public:int fib(int n) {if (n <= 1) { //特判return n;}int a = 0, b = 1;for (int i = 2; i <= n; ++i) {int t = a + b;a = b;b = t;}return b;}
};

python3代码如下,

class Solution:def fib(self, n: int) -> int:if n <= 1: #特判return n a, b = 0, 1for i in range(2,n+1):a, b = b, a + breturn b

题目2:70. 爬楼梯

C++代码如下,

class Solution {
public:int climbStairs(int n) {if (n <= 2) { //特判return n;}int a = 1, b = 2;for (int i = 3; i <= n; ++i) {int t = a + b;a = b;b = t;}return b;}
};

python3代码如下,

class Solution:def climbStairs(self, n: int) -> int:if n <= 2: #特判return na, b = 1, 2for i in range(3,n+1):a, b = b, a + breturn b

题目3:746. 使用最小花费爬楼梯

C++代码如下,

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {int n = cost.size();vector<int> dp(n+1, 0);//状态定义//dp[i]:跑到第i层阶梯所需的最小花费//状态转移//dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])//状态初始化//dp[0] = 0, dp[1] = 0for (int i = 2; i < n+1; ++i) {dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]);}return dp[n];}
};

python3代码如下,

class Solution:def minCostClimbingStairs(self, cost: List[int]) -> int:n = len(cost)dp = [0] * (n+1)#状态定义#dp[i]:爬到第i个阶梯的最小花费#状态转移#dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])#状态初始化#dp[0] = 0, dp[1] = 0for i in range(2, n+1):dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2])return dp[n]

题目4:62. 不同路径

C++代码如下,

数学解法如下,

class Solution {
public:int uniquePaths(int m, int n) {m -= 1;n -= 1;//计算C[n+m][n]long long ans = 1;for (int i = m+1, j = 0; j < n; ++j, ++i) {ans = ans * i / (j + 1);}return ans;}
};

动态规划解法如下,

class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> dp(n, vector<int>(m, 0));//状态定义//dp[i][j]:从(0,0)走到(i,j)的走法//状态转移//dp[i][j] = dp[i-1][j] + dp[i][j-1]//状态初始化//dp[i][0] = 1//dp[0][j] = 1for (int i = 0; i < n; ++i) dp[i][0] = 1;for (int j = 0; j < m; ++j) dp[0][j] = 1;for (int i = 1; i < n; ++i) {for (int j = 1; j < m; ++j) {dp[i][j] = dp[i-1][j] + dp[i][j-1]; }}return dp[n-1][m-1];}
};

python3代码如下,

数学解法,

class Solution:def uniquePaths(self, m: int, n: int) -> int:m -= 1n -= 1#计算组合数C[n+m][m]i = n+1j = 1res = 1while j <= m:res = res * i / jj += 1i += 1return int(res)
#C++中可能会超过整型数值范围
class Solution:def uniquePaths(self, m: int, n: int) -> int:m -= 1n -= 1C = [[0] * 110 for _ in range(110)]for i in range(110):for j in range(i+1):if j == 0:C[i][j] = 1else:C[i][j] = C[i-1][j] + C[i-1][j-1]return C[m+n][m]
#C++中可能会超过整型数值范围
class Solution:def uniquePaths(self, m: int, n: int) -> int:m -= 1n -= 1#求C[n+m][m]fa = 1fb = 1for i in range(1,n+1):fa *= m + n - i + 1fb *= i res = fa // fbreturn res 

动态规划解法

class Solution:def uniquePaths(self, m: int, n: int) -> int:dp = [[0] * m for _ in range(n)]dp[0][0] = 1for i in range(1,n):dp[i][0] = dp[i-1][0]for j in range(1,m):dp[0][j] = dp[0][j-1]for i in range(1,n):for j in range(1,m):dp[i][j] = dp[i-1][j] + dp[i][j-1]return dp[n-1][m-1]

题目5:63. 不同路径 II

C++代码如下,

class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int n = obstacleGrid.size();int m = obstacleGrid[0].size();vector<vector<int>> dp(n, vector<int>(m, 0));dp[0][0] = obstacleGrid[0][0] == 0 ? 1 : 0;for (int i = 1; i < n; ++i) {if (obstacleGrid[i][0] == 0) {dp[i][0] = dp[i-1][0];}}for (int j = 1; j < m; ++j) {if (obstacleGrid[0][j] == 0) {dp[0][j] = dp[0][j-1];}}for (int i = 1; i < n; ++i) {for (int j = 1; j < m; ++j) {if (obstacleGrid[i][j] == 0) {dp[i][j] = dp[i-1][j] + dp[i][j-1];}}}return dp[n-1][m-1];}
};

python3代码如下,

class Solution:def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:n = len(obstacleGrid)m = len(obstacleGrid[0])dp = [[0] * m for _ in range(n)]dp[0][0] = 1 if obstacleGrid[0][0] == 0 else 0for i in range(1,n):if obstacleGrid[i][0] == 0:dp[i][0] = dp[i-1][0]for j in range(1,m):if obstacleGrid[0][j] == 0:dp[0][j] = dp[0][j-1]for i in range(1,n):for j in range(1,m):if obstacleGrid[i][j] == 0:dp[i][j] = dp[i-1][j] + dp[i][j-1]return dp[n-1][m-1]

题目6:343. 整数拆分

C++代码如下,

class Solution {
public:int integerBreak(int n) {int res = 1;for (int k = 2; k <= n; ++k) {//将n拆分成k个数int a = n / k;vector<int> nums(k, a);int t = n - a * k;for (int i = 0; i < t; ++i) nums[i] += 1;int ans = 1;for (auto x : nums) ans *= x;res = max(res, ans);}return res;}
};

python3代码如下,

class Solution:def integerBreak(self, n: int) -> int:res = 1 #答案的理论最小值for k in range(2,n):#将n拆分成k个数a = n // knums = [a] * kt = n - a * kfor i in range(t):nums[i] += 1ans = 1for x in nums:ans *= x res = max(res, ans)return res

题目7:96. 不同的二叉搜索树

C++代码如下,

class Solution {
public:int numTrees(int n) {vector<int> dp(n + 1, 0);dp[0] = 1;for (int i = 1; i <= n; ++i) {for (int j = 1; j <= i; ++j) {dp[i] += dp[j-1] * dp[i-j];}}return dp[n];}
};

python3代码如下,

class Solution:def numTrees(self, n: int) -> int:dp = [0] * (n + 1) dp[0] = 1for i in range(n+1):for j in range(1,i+1):dp[i] += dp[j-1] * dp[i-j]return dp[n] 

题目8:46. 携带研究材料(第六期模拟笔试)

C++代码如下,

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 5010, M = 5010;
int v[N];
int w[N];
int m;
int n;
int dp[M];int main() {cin >> n >> m;for (int i = 0; i < n; ++i) {cin >> v[i];}for (int i = 0; i < n; ++i) {cin >> w[i];}for (int i = 0; i < n; ++i) {for (int j = M; j - v[i] >= 0; --j) {dp[j] = max(dp[j], dp[j-v[i]] + w[i]);}}cout << dp[m] << endl;return 0;
}

python3代码如下,

import sys data = sys.stdin.read()
lines = data.splitlines()
n, m = map(int, lines[0].split())
v = list(map(int, lines[1].split()))
w = list(map(int, lines[2].split()))dp = [0] * (m + 10)
for i in range(n):for j in range(m,v[i]-1,-1):dp[j] = max(dp[j], dp[j-v[i]] + w[i])
print(dp[m])

题目9:416. 分割等和子集

C++代码如下,

class Solution {
public:bool canPartition(vector<int>& nums) {int totalSum = accumulate(nums.begin(), nums.end(), 0);if (totalSum % 2 != 0) return false;int targetSum = totalSum / 2;vector<int> dp(targetSum + 10, 0);for (int i = 0; i < nums.size(); ++i) {for (int j = targetSum; j >= nums[i]; --j) {dp[j] = max(dp[j], dp[j-nums[i]] + nums[i]);}}return dp[targetSum] == targetSum;}
};

python3代码如下,

class Solution:def canPartition(self, nums: List[int]) -> bool:totalSum = sum(nums)if totalSum % 2 != 0:return FalsetargetSum = totalSum // 2#从nums中能否找到一些数,使得它们之和等于targetSum#套用01背包模型dp = [0] * (targetSum + 10)for i in range(len(nums)):for j in range(targetSum, nums[i]-1, -1):dp[j] = max(dp[j], dp[j-nums[i]] + nums[i])return dp[targetSum] == targetSum

题目10:1049. 最后一块石头的重量 II

C++代码如下,


python3代码如下,


3 参考

代码随想录官网

这篇关于代码随想录leetcode200题之动态规划算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1022778

相关文章

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu