代码随想录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++代码如下,

class Solution {
public:int lastStoneWeightII(vector<int>& stones) {int totalSum = accumulate(stones.begin(), stones.end(), 0);int m = totalSum / 2;int n = stones.size();vector<int> dp(m + 1, 0);for (int i = 0; i < n; ++i) {for (int j = m; j >= stones[i]; --j) {dp[j] = max(dp[j], dp[j-stones[i]]+stones[i]);}}int a = dp[m];int b = totalSum - a;return abs(a-b);}
};

python3代码如下,

class Solution:def lastStoneWeightII(self, stones: List[int]) -> int:#装换成01背包模型totalSum = sum(stones)m = totalSum // 2n = len(stones)dp = [0] * (m + 1)for i in range(n):for j in range(m,stones[i]-1,-1):dp[j] = max(dp[j], dp[j-stones[i]]+stones[i])a = dp[m]b = totalSum - areturn abs(a - b)

题目11:494. 目标和

C++代码如下,


python3代码如下,

class Solution:def findTargetSumWays(self, nums: List[int], target: int) -> int:#01背包求最大价值->01背包问题求方案数totalSum = sum(nums)if target > totalSum:return 0if (target + totalSum) % 2 != 0:return 0 m = (target + totalSum) // 2if m < 0:return 0n = len(nums)dp = [0] * (m + 1)#状态定义#dp[j]:填满容积为j的背包,有多少种方案数#状态转移#dp[j] += d[j-nums[i]]#状态初始化#dp[0] = 1dp[0] = 1for i in range(n):for j in range(m, nums[i]-1, -1):dp[j] += dp[j-nums[i]]return dp[m]

3 参考

代码随想录官网

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

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

相关文章

C语言进程编程:探索操作系统的核心机制

C语言进程编程&#xff1a;探索操作系统的核心机制 在C语言的广阔领域中&#xff0c;进程编程无疑是一块充满挑战与机遇的阵地。进程作为操作系统分配资源的基本单位&#xff0c;其编程涉及到系统调用、进程控制、通信与同步等多个复杂而关键的概念。本文将围绕四个方面、五个…

限流算法整理——滑动窗口限流算法

限流算法描述 滑动窗口限流需要将每个窗口空间划分为无限小的窗口区间&#xff0c;并且动态调整区间的起始点&#xff0c;并且在调整完毕之后需要判断各个区间&#xff0c;累加各个区间的请求&#xff0c;查看是否到达最大的阈值&#xff0c;以此返回允许请求还是拒绝请求 算…

计算机常用的英语单词

在计算机科学与技术领域&#xff0c;有一些常用的英语单词和术语是学习者需要掌握的。以下是一些常见的计算机必会英语单词&#xff0c;分为不同的类别&#xff1a; 1. 编程语言和技术&#xff1a; Algorithm - 算法Programming - 编程Code - 代码Variable - 变量Function - …

PyTorch学习(11):PyTorch的形状变换(view, reshape)与维度变换(transpose, permute)

PyTorch学习&#xff08;1&#xff09;&#xff1a;torch.meshgrid的使用-CSDN博客 PyTorch学习&#xff08;2&#xff09;&#xff1a;torch.device-CSDN博客 PyTorch学习&#xff08;9&#xff09;&#xff1a;torch.topk-CSDN博客 PyTorch学习&#xff08;10&#xff09;…

数据库与数据库管理系统 MySQL的安装 SQL语言学习:DDL、DML

day51 数据库 数据库&#xff08;database&#xff09;就是一个存储数据的仓库。为了方便数据的存储和管理&#xff0c;它将数据按照特定的规律存储在磁盘上。 通过数据库管理系统&#xff0c;可以有效地组织和管理存储在数据库中的数据&#xff0c;如数据库管理系统MySQL 数据…

Java学习Lambda表达式

Lambda表达式 有且只有一个未实现的方法叫做Lambda表达式&#xff0c;可以实现函数式编程 // 这个注解是用来检查你写的函数是否是函数式接口 FunctionalInterfaceinterface Myinterface {int sum(int a, int b);default String priteTitle(String name, int age, String sex)…

Kubernetes资源调度策略及实现机制

目录 一、资源调度策略 1.默认调度器&#xff08;Default Scheduler&#xff09; 2.自定义调度器&#xff08;Custom Scheduler&#xff09; 3.亲和性与反亲和性&#xff08;Affinity and Anti-Affinity&#xff09; 4.污点与容忍&#xff08;Taint and Tolerations&#…

时间序列差分顺序的讨论

生成出一组时间序列数据 服从标准正态分布的50个 随机数据 分别给出4步季节差分&#xff0c;再进行1步1阶差分的结果 和 1步1阶差分再进行 4步季节差分 的结果 讨论&#xff1a; 先进行4步季节差分再进行1步1阶差分与先进行1步1阶差分再进行4步季节差分的结果看起来是相同的

计算机网络复习(2)性能指标 带宽

计算机网络的性能指标是衡量网络效率、可靠性和服务质量的重要参数&#xff0c;它们帮助我们理解网络如何工作以及如何优化网络性能。以下是计算机网络中几个关键的性能指标的详细介绍&#xff1a; 1. 速率 (Rate) / 比特率 (Bit Rate) / 数据率 (Data Rate) 速率指的是数据在…

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:潍柴雷沃智慧农业无人驾驶

潍柴雷沃智慧农业科技股份有限公司&#xff0c;是潍柴集团重要的战略业务单元&#xff0c;旗下收获机械、拖拉机等业务连续多年保持行业领先&#xff0c;是国内少数可以为现代农业提供全程机械化整体解决方案的品牌之一。潍柴集团完成对潍柴雷沃智慧农业战略重组后&#xff0c;…

kaggle:房价预测

比赛链接 结果展示 结果链接 8848是密码 文章目录 数据处理调包部分拒绝掉包岭回归理论代码实践结果 自助采样理论代码 集成学习前言Bagging理论Bagging-Ridge代码Bagging-Ridge实践Bagging-Ridge结果 Tricks 数据处理 #打开文件 import pandas as pd dataset1pd.read_csv(&q…

Arduino编程变量:深度探索与实际应用

Arduino编程变量&#xff1a;深度探索与实际应用 在Arduino编程中&#xff0c;变量扮演着至关重要的角色。它们用于存储程序运行过程中的临时数据&#xff0c;是实现各种功能和算法的关键。然而&#xff0c;对于初学者来说&#xff0c;变量的理解和使用往往充满了困惑和挑战。…

Java 基础面试300题 (111-140)

Java 基础面试300题 &#xff08;111-140&#xff09; 111.什么是Java包&#xff1f; 有什么优点&#xff1f; 包是相关Java类型的集合。包中可以包括相关的类、接口和枚举。使用包来组织软件代码有几方面的优点&#xff1a; 包有助于将相关代码保存在一起。包有助于避免命名…

How to install a dataset from huggingface?

当我从抱抱脸上git clone imdb数据集时&#xff0c;plain_text里的文件是这样的&#xff1a;

梦想的味道,特别的邀约 —— 蒙自源六一儿童节特别活动

每个孩子心中都有一颗梦想的种子&#xff0c;只需一点阳光和雨露&#xff0c;便能生根发芽&#xff0c;开出绚烂的花朵。六一儿童节&#xff0c;是孩子们的节日&#xff0c;也是他们梦想起航的日子。蒙自源希望成为孩子们梦想的沃土&#xff0c;用美食和爱滋养他们的成长。在这…

【Qt知识】Qt框架中的信号(Signals)与槽(Slots)机制

Qt框架中的信号&#xff08;Signals&#xff09;与槽&#xff08;Slots&#xff09;机制是一种强大的通信方式&#xff0c;允许对象之间相互通信而无需对象之间直接引用或了解对方。这一机制简化了应用程序的事件处理和组件之间的交互&#xff0c;是Qt的一大特色和核心概念。 …

Qt6.4.2基于CMake添加Qt3DCore模块报错

在文档中说明是添加 find_package(Qt6 REQUIRED COMPONENTS 3dcore) target_link_libraries(mytarget PRIVATE Qt6::3dcore)find_package是没有问题&#xff0c;但是target_link_libraries会报错&#xff0c;报拼写错误&#xff0c;无法链接上Qt6::3dcore 需要使用“3DCore”…

windows系统搭建go开发编译环境

1、前言 windows系统&#xff0c;从零开始搭建go开发编译环境详细步骤。 2、go下载和安装 2.1 下载 下载地址如下&#xff1a; All releases - The Go Programming Language 可以根据自己的需要选择下载对应的版本下载即可。 对于windows系统&#xff0c;如果是6…

有开源软件,也有开源硬件?

开源软件或库有很多&#xff0c;例如 Linux 操作系统的内核 The Linux Kernel Archiveshttps://www.kernel.org/ 开源的各种Linux发行版本&#xff0c;Ubuntu 、CentOS等 Enterprise Open Source and Linux | Ubuntuhttps://ubuntu.com/ 开源的视觉函数库&#xff0c;OpenC…

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:美团小袋自动配送车

大型电商公司美团已选用NVIDIA Jetson AGX Xavier 平台&#xff0c;作为无人配送机器人核心AI算力。 美团点评是全球大型的按需食品配送公司&#xff0c;结合了Uber Eats、Yelp和Groupon的商业模式&#xff0c;与超过40万家本地企业开展合作。他们推出了小袋自动配送车&#…