news 2026/5/11 9:48:33

学习周报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/5/5 13:11:16

3大痛点解析:Flink监控体系为何总是失效?终极解决方案来了!

你是否经历过Flink作业突然卡死却找不到原因&#xff1f;背压监控数据一片空白&#xff1f;检查点频繁失败却无从下手&#xff1f;这些困扰开发者的监控难题&#xff0c;本文将为你一一解决&#xff01;&#x1f680; 【免费下载链接】flink 项目地址: https://gitcode.com/…

作者头像 李华
网站建设 2026/5/2 7:54:01

Latest:macOS应用更新的终极完整指南

Latest&#xff1a;macOS应用更新的终极完整指南 【免费下载链接】Latest A small utility app for macOS that makes sure you know about all the latest updates to the apps you use. 项目地址: https://gitcode.com/gh_mirrors/la/Latest Latest 是一款专为 macOS …

作者头像 李华
网站建设 2026/5/10 15:47:08

多语言代码质量检测神器:fuck-u-code的国际化实践解析

在全球化协作日益普及的软件开发环境中&#xff0c;代码质量工具的国际化支持已成为提升开发效率的关键要素。GitHub精选项目"fuck-u-code"作为一款基于Go语言构建的代码质量检测器&#xff0c;不仅能够精准评估代码的"屎山等级"&#xff0c;更通过完善的国…

作者头像 李华
网站建设 2026/5/8 10:45:43

终极伺服系统设计指南:5步快速掌握电机控制核心技术

终极伺服系统设计指南&#xff1a;5步快速掌握电机控制核心技术 【免费下载链接】伺服系统设计指导PDF资源说明分享 《伺服系统设计指导》是一本专门针对电机运动控制领域的参考书籍。本书深入浅出地介绍了伺服系统的设计精髓&#xff0c;涵盖了从基础理论到实际应用的广泛知识…

作者头像 李华
网站建设 2026/5/10 18:45:29

5步快速上手GPT-2 XL:从零开始的AI写作实战指南

5步快速上手GPT-2 XL&#xff1a;从零开始的AI写作实战指南 【免费下载链接】gpt2-xl 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/gpt2-xl 还在为复杂的AI模型部署而头疼吗&#xff1f;&#x1f914; 想要快速掌握强大的文本生成能力却不知从何入手&…

作者头像 李华
网站建设 2026/5/10 18:22:18

windows不会自更新时应怎样处理?

当Windows自动更新功能失效时&#xff0c;这是一个需要认真对待的问题。系统无法获取安全补丁&#xff0c;会带来严重的安全风险。请按照以下从易到难、逐步排查的流程来解决问题。 第一步&#xff1a;基础检查与快速修复检查网络与时间 网络&#xff1a;确保网络连接正常&…

作者头像 李华