当前位置: 首页 > news >正文

力扣热题之多维动态规划

焦虑ing,赶快把力扣100刷完去看大模拟了。。

1.不同路径

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

2.最小路径和

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

3.最长回文字串

这个我之前尝试过,一年半以前,看看一年半后有没有长近orz

还是不会,靠。我又会了,画个图又行了。果然是有长近的

class Solution {
public:string longestPalindrome(string s) {if(s.size()==0||s.size()==1) return s;int n=s.size();vector<vector<int>> dp(n,vector<int>(n,-1));int left=0;int right=0;int ans=1;for(int i=0;i<n;i++) dp[i][i]=1;for(int i=0;i<n-1;i++){if(s[i]==s[i+1]){dp[i][i+1]=2;left=i;right=i+1;ans=2;}}for(int gap=2;gap<n;gap++){for(int i=0;i<n-gap;i++){int j=i+gap;if(dp[i+1][j-1]!=-1&&s[i]==s[j]) {dp[i][j]=dp[i+1][j-1]+2;if(dp[i][j]>ans){left=i;right=j;ans=dp[i][j];}}}}return s.substr(left,right-left+1);}
};

4.最长公共子序列

力扣的提示很到位

class Solution {
public:int longestCommonSubsequence(string text1, string text2) {int m=text1.size();int n=text2.size();vector<vector<int>> dp(m,vector<int>(n,0));//初始化for(int i=0;i<m;i++){if(text1[i]==text2[0]) dp[i][0]=1;if(i>0) dp[i][0]=max(dp[i][0],dp[i-1][0]);}for(int j=0;j<n;j++){if(text1[0]==text2[j]) dp[0][j]=1;if(j>0) dp[0][j]=max(dp[0][j],dp[0][j-1]);}//状态转移if(m==1) return dp[0][n-1];if(n==1) return dp[m-1][0];for(int i=1;i<m;i++){for(int j=1;j<n;j++){if(text1[i]==text2[j]) dp[i][j]=dp[i-1][j-1]+1;else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);}}return dp[m-1][n-1];}
};

5.编辑距离

这个也能动态规划吗。。有点意思 我决定手撕一下。撕不了,完全不会。

必须尝试理解一下这个题,理解不了就先过拟合硬记。

有一个字符为空串的这个判断写的很简洁。

class Solution {
public:int minDistance(string word1, string word2) {int m=word1.size();int n=word2.size();vector<vector<int>>dp (m+1,vector<int>(n+1,INT_MAX));for(int i=0;i<m+1;i++) dp[i][0]=i;for(int i=0;i<n+1;i++) dp[0][i]=i;// 有一个字符串为空串if (n * m == 0) return n + m;for(int i=1;i<m+1;i++){for(int j=1;j<n+1;j++){int left=dp[i-1][j]+1;int down=dp[i][j-1]+1;int left_down=dp[i-1][j-1];if(word1[i-1]!=word2[j-1]) left_down++;dp[i][j]=min({left,down,left_down});}}return dp[m][n];}
};

http://www.dtcms.com/a/347349.html

相关文章:

  • [2025CVPR-目标检测方向]学习增量对象检测的内生注意力
  • Redis(18)Redis的键空间通知机制是如何工作的?
  • LangChain4j中集成Redis向量数据库实现Rag
  • 设计模式详解
  • 服务器支持IPv6吗?如何让服务器支持IPv6
  • 疏老师-python训练营-Day54Inception网络及其思考
  • 电阻的标称阻值
  • Python中可以使用中文命名变量、函数、类和方法吗?详细示例与解析
  • Java集合(Collection、Map、转换)
  • JavaScript性能优化实战:从瓶颈识别到极致体验
  • 进阶版蛋白互作研究方法:构建 “体内 + 体外 + 结构 + 功能” 多维度论证体系
  • 场景题:有100个球,其中50个红球和50个黑球,要分配到两个袋子中。然后随机选择一个袋子,再从中随机取一个球,目标是使取到红球的概率最大。
  • n8n 键盘快捷键和控制
  • 数据整理自动化 - 让AI成为你的数据助手
  • Java八股文-java基础面试题
  • 叮小跳APP:自动跳过广告,提升使用体验
  • jQuery 知识点复习总览
  • 在 Spring Boot 中配置和使用多个数据源
  • JetPack 与 PyTorch 版本对应及资源详情
  • 【深度学习】蒙特卡罗方法:原理、应用与未来趋势
  • c# .net支持 NativeAOT 或 Trimming 的库是什么原理
  • 【Python】新手入门:为什么需要类型注解?如何使用Mypy进行静态类型检查?复杂类型注解语法是怎么样的?
  • 遇到的数学知识补充
  • 利用zip格式文件的更新功能来对xlsx文件做更改
  • Claude Code赋能企业级开发:外卖平台核心系统的智能化重构
  • LDP标签分发协议
  • 疯狂星期四文案网第48天运营日记
  • 深度学习中主流激活函数的数学原理与PyTorch实现综述
  • Spring AI开发指导-对话模型
  • WiFi有网络但是电脑连不上网是怎么回事?该怎么解决?