news 2026/7/3 10:48:07

学习周报7

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
学习周报7

本周主要对动态规划进行了初步的学习并在力扣上进行了练习

内容

我认为动态规划有两大要点

1.找到相应的递推公式。
2.找到i,j,dp[i][j]的含义。
在其中有
63.不同路径II

int** inidp(int n, int m, int** obstacleGrid){ int** dp = (int**)malloc(m * sizeof(int*)); for(int i = 0;i < m;i++){ dp[i] = (int*)malloc(n * sizeof(int)); } for(int i = 0;i < m;i++){ dp[i][0] = 0; } for(int i = 0;i < n;i++){ dp[0][i] = 0; } for(int i = 0;i < m;i++){ if(obstacleGrid[i][0])break; dp[i][0] = 1; } for(int i = 0;i < n;i++){ if(obstacleGrid[0][i])break; dp[0][i] = 1; } return dp; } int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obstacleGridColSize) { int n = *obstacleGridColSize; int m = obstacleGridSize; if(obstacleGrid[0][0] == 1 || obstacleGrid[m - 1][n - 1] == 1)return 0; int** dp = inidp(n,m,obstacleGrid); for(int i = 1;i < m;i++){ for(int j = 1;j < n;j++){ if(obstacleGrid[i][j]){ dp[i][j] = 0; continue; } dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; } } return dp[m - 1][n - 1]; }


是典型的应用
在这其中明白障碍点的路径数为0,第一行列的路径数为1(若障碍在第一行列时,自障碍以后的全是0)
到达非第一行列的路径是其上面的路径数 + 左边的路径数。
其中i代表的是行,j代表列,dp[i][j]代表该点的路径数
便大概可以做出本题

01背包问题(二维)

#include<stdio.h> #include<stdlib.h> int max(int a, int b){ return (a > b)?a:b; } int main(){ int n, m, i, j; scanf("%d %d",&n,&m);//n 为物品数量 , m 为背包容量 。 int a[n], b[n]; for(i = 0;i < n;i++){ scanf("%d",&a[i]); } for(i = 0;i < n;i++){ scanf("%d",&b[i]); } int** dp = (int**)malloc(n * sizeof(int*)); for(i = 0;i < n;i++){ dp[i] = (int*)malloc((m + 1) * sizeof(int));//因为有 背包容量为 m 则会有[0—m]个位置,因此要m+1. } //全部初始化为0 。 for(i = 0;i < n;i++){ for(j = 0;j <= m;j++){ dp[i][j] = 0; } } //将第一个物品所代表的行填满,当背包容量j > 物品质量a[0]时,将第一个物品的价值填入。 for(j = 0;j <= m;j++){ if(j >= a[0]) dp[0][j] = b[0]; } for(i = 1;i < n;i++){ for(j = 0;j <= m;j++){ if(j < a[i])dp[i][j] = dp[i - 1][j];//若当前物品质量>背包容量则将上一个物品的价值填入(若上一个也不满足则会继续往上,倘若没有合适的则会为0) else{ //若当前物品质量<背包容量则会将会为 上一个物品的价值 和 当前物品的价值 + 上一个物品在背包容量为 (当前背包容量 - 当前物品质量时的价值 的最大值。 dp[i][j] = max(dp[i-1][j],dp[i - 1][j - a[i]] + b[i]); } } } printf("%d",dp[n - 1][m]); return 0; }


其要点在注释中已写

背包问题的的递推公式为dp[i-1][j],dp[i - 1][j - a[i]] + b[i]。

01背包问题(一维)

#include<stdio.h> #include<stdlib.h> int max(int a,int b){ return (a > b)? a : b; } int main(){ int n, m, i, j; scanf("%d %d",&n,&m); int a[n], v[n]; for(i = 0;i < n;i++){ scanf("%d",&a[i]); } for(i = 0;i < n;i++){ scanf("%d",&v[i]); } int* dp = (int*)malloc((m + 1) * sizeof(int)); for(i = 0;i <= m;i++){ dp[i] = 0; } for(i = 0;i <= m;i++){ if(i >= a[0]){ dp[i] = v[0]; } } for(i = 1;i < n;i++){ for(j = 0;j <= m;j++){ if(j < a[i]); else{ dp[j] = max(dp[j],dp[j - a[i]] + v[i]); } } } printf("%d",dp[m]); return 0; }

相比于二维而言一维的差异在递推公式

dp[j] = max(dp[j],dp[j - a[i]] + v[i])

其中01背包的类型我目前见过三种

1.返回正误

416.分割等和子集

int max(int a, int b){ return (a > b)? a : b; } bool canPartition(int* nums, int numsSize) { int sum = 0; for(int i = 0;i < numsSize;i++){ sum += nums[i]; } if(sum % 2){ return false; } int mid = sum / 2; int* dp = (int*)malloc((mid + 1) * sizeof(int)); for(int i = 0;i <= mid;i++){ dp[i] = 0; } for(int i = 0;i <= mid;i++){ if(i >= nums[0]){ dp[i] = nums[0]; } } for(int i = 1;i < numsSize;i++){ for(int j = mid;j > nums[i];j--){ if(j < nums[i]); else{ dp[j] = max(dp[j],dp[j - nums[i]] + nums[i]); } } } return dp[mid] == mid; }

2.返回数

int max(int a, int b){ return (a > b)? a : b; } int lastStoneWeightII(int* stones, int stonesSize) { int sum = 0; for(int i = 0;i < stonesSize;i++){ sum += stones[i]; } int mid = sum / 2; int* dp = (int*)calloc((mid + 1) , sizeof(int)); for(int i = 0;i <= mid ; i++){ if(i >= stones[0]){ dp[i] = stones[0]; } } for(int i = 1;i < stonesSize;i++){ for(int j = mid;j >= stones[i];j--){ if(j >= stones[i]){ dp[j] = max(dp[j],dp[j - stones[i]] + stones[i]); } } } int n = sum - 2 * dp[mid]; return n; }

3.返回数组数

int max(int a, int b){ return (a > b)? a : b; } int findMaxForm(char** strs, int strsSize, int m, int n) { int dp[m+1][n+1]; memset(dp,0,sizeof(int) * (n+1) * (m+1)); for(int k = 0;k < strsSize;k++){ int n1 = 0; int n0 = 0; char* str = strs[k]; while(*str != '\0'){ if(*str == '0'){ n0++; }else{ n1++; } str++; } for(int i = m;i >= n0;i--){ for(int j = n;j >= n1;j--){ dp[i][j] = max(dp[i][j],dp[i - n0][j - n1] + 1); } } } return dp[m][n]; }

这三种的应用主要是在于对题目的理解

以及dp数组的含义和递推公式

总结

动态规划的内容很多,我现在只能对其部分进行应用

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/29 15:35:39

大连格恩朗金属管浮子流量计:精准破局,赋能工业流体计量

自2019年扎根流量测量领域&#xff0c;大连格恩朗始终坚守“技术筑基、精准至上”的初心&#xff0c;聚焦工业流体计量痛点&#xff0c;深耕金属管浮子流量计的研发与智造。凭借对精度的极致追求和对工况的深度适配&#xff0c;品牌打造的金属管浮子流量计&#xff0c;已成为化…

作者头像 李华
网站建设 2026/7/1 22:27:59

如何做Dify二次开发?

很多Dify开源版用户在使用的时候&#xff0c;总是在尝试做二次开发来解决开源权限管控等不足的问题&#xff0c;但往往不知道如何下手。本文将以实际二次开发项目dify-plus为例&#xff0c;带你深入体验Dify 二次开发过程&#xff0c;掌握从环境搭建到生产部署的全流程二次开发…

作者头像 李华
网站建设 2026/7/2 22:15:29

剧想天开,造梦未来|一场关于“儿童剧人物造型”的想象力实验

儿童戏剧&#xff0c;是投射在少年儿童心灵舞台上的第一束光。人物造型&#xff0c;作为这束光中最具象、最绚烂的色彩&#xff0c;不仅定义角色的灵魂&#xff0c;更深刻影响着儿童认知世界的方式与审美情感的塑造。党和国家将美育置于培育时代新人的战略高度&#xff0c;而儿…

作者头像 李华
网站建设 2026/7/1 2:03:24

Vue Konva实战指南:从零构建交互式画布应用

Vue Konva实战指南&#xff1a;从零构建交互式画布应用 【免费下载链接】vue-konva Vue & Canvas - JavaScript library for drawing complex canvas graphics using Vue. 项目地址: https://gitcode.com/gh_mirrors/vu/vue-konva 你是否曾经想要在Vue应用中添加精美…

作者头像 李华
网站建设 2026/6/26 19:39:04

房产中介系统APP六大排名

在房产中介行业数字化转型的浪潮中&#xff0c;一款优质的房产中介房源管理系统成为提升运营效率、规范业务流程的核心支撑。无论是个体经纪人、夫妻小店&#xff0c;还是连锁中介机构&#xff0c;都需要适配自身需求的房产中介房源管理软件来实现房客源的精准管控、业务流程的…

作者头像 李华
网站建设 2026/7/2 16:10:07

16、Linux常用命令详解

Linux常用命令详解 1. ftpd命令 1.1 ftp子命令 命令 功能 site [command] 在远程机器上运行特定站点命令 size filename 返回远程机器上指定文件的大小 status 显示当前ftp状态 struct [struct-name] 设置文件传输结构,默认使用流结构 sunique 切换远程机器…

作者头像 李华