dpdpdp

这里写目录标题

    • 139. 单词拆分
    • 322. 零钱兑换
    • 300. 最长递增子序列
    • 120. 三角形最小路径和
    • 64. 最小路径和
    • 63. 不同路径 II
    • 5. 最长回文子串(回文dp)⭐
    • 97. 交错字符串⭐(抽象成路径问题)
    • 221. 最大正方形⭐

139. 单词拆分

class Solution {
public:const int N=305;bool wordBreak(string s, vector<string>& wordDict) {vector<bool> dp(N,false);set<string> S;S.clear();for(int i=0;i<wordDict.size();i++){S.insert(wordDict[i]);}dp[0]=true;int n=s.size();for(int i=1;i<=n;i++){//从头开始长度为i的子串for(int j=0;j<i;j++){if(dp[j]){string str=s.substr(j,i-1-(j-1));//0123if(S.find(str)!=S.end()){dp[i]=true;}}}}return dp[n];}
};

322. 零钱兑换

class Solution {
public:const int inf=0x3f3f3f3f;int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount+1,inf);// dp[i]表示凑出金额i最少需要的硬币个数dp[0]=0;int n=coins.size();for(int i=1;i<=amount;i++){for(int j=0;j<n;j++){if(i>=coins[j]){dp[i]=min(dp[i],dp[i-coins[j]]+1);}}}if(dp[amount]==inf)return -1;else return dp[amount];}
};

恰好装满型完全背包

class Solution {
public:const int inf=0x3f3f3f3f;int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount+1,inf);// dp[i]表示凑出金额i最少需要的硬币个数dp[0]=0;int n=coins.size();for(int j=0;j<n;j++){for(int i=coins[j];i<=amount;i++){if(i>=coins[j]){dp[i]=min(dp[i],dp[i-coins[j]]+1);}}}if(dp[amount]==inf)return -1;else return dp[amount];}
};

300. 最长递增子序列

class Solution {
public:int lengthOfLIS(vector<int>& nums) {int n=nums.size();vector<int> dp(n+5,1);// dp[0]=0;int res=1;for(int i=0;i<n;i++){//i是上升子序列最后一个元素的下标for(int j=0;j<i;j++){if(nums[i]>nums[j]){dp[i]=max(dp[i],dp[j]+1);res=max(res,dp[i]);}}}return res;}
};

贪心思想,碰到小的元素,尽可能放在前面
最后得到的最长上升子序列,假设存储在d数组中,d数组的演变过程:
来了个更大的元素(大于d[len]), 直接插入在末尾
如果小,找到大于nums[i] 的第一个元素,替换掉

class Solution {
public:int lengthOfLIS(vector<int>& nums) {int n=nums.size();vector<int> d(n+5,1);int len=0;d[len]=nums[0];for(int i=1;i<n;i++){if(nums[i]>d[len]){d[++len]=nums[i];}else{//找到第一个大于nums[i]的d[k] 换掉int l=0,r=len;while(l<r){int mid=(l+r)/2;// if(d[mid]>nums[i])r=mid;// else l=mid+1;找最大// if(d[mid]<nums[i])r=mid;// else l=mid+1;if(d[mid]<nums[i])l=mid+1;else r=mid;}d[l]=nums[i];}}return len+1;}
};

lower_bound,找到大于等于nums[i]的第一个元素

class Solution {
public:int lengthOfLIS(vector<int>& nums) {int n=nums.size();vector<int> d;for(int i=0;i<n;i++){
vector<int>::iterator it =lower_bound(d.begin() , d.end() ,nums[i]);
if(it==d.end())d.push_back(nums[i]);
elseswap(*it,nums[i]);}return d.size();}
};

120. 三角形最小路径和

倒三角形,注意下标

class Solution {
public:int minimumTotal(vector<vector<int>>& triangle) {int m=triangle.size();// int n=triangle[0].size();vector<vector<int> > dp(m,vector<int>(m,0));dp[0][0]=triangle[0][0];// int res=0x3f3f3f3f;int res=2e6+10;for(int i=1;i<m;i++){for(int j=0;j<=i;j++){if(j==0)dp[i][j]=dp[i-1][j]+triangle[i][j];else if(j==i)dp[i][j]=dp[i-1][j-1]+triangle[i][j];else dp[i][j]=min(dp[i-1][j-1],dp[i-1][j])+triangle[i][j];// if(i==m-1)res=min(res,dp[i][j]);怎么放在这儿就不行了why not??????}}//  res=*min_element(dp[m-1].begin(),dp[m-1].end());//    res=min(2000010,-10);for(int i=0;i<m;i++)res=min(res,dp[m-1][i]);return res;}
};

64. 最小路径和

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 j=1;j<n;j++)dp[0][j]=dp[0][j-1]+grid[0][j];for(int i=1;i<m;i++){for(int j=0;j<n;j++){if(j==0)dp[i][j]=dp[i-1][j]+grid[i][j];else dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j];}}return dp[m-1][n-1];}
};

63. 不同路径 II

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

5. 最长回文子串(回文dp)⭐

class Solution {
public:string longestPalindrome(string s) {int L=s.size();vector<vector<bool> > dp(L+1,vector<bool>(L+1,false));int maxlen=1;int pos=0;for(int len=1;len<=L;len++){for(int i=0;i+len-1<L;i++){int j=i+len-1;// dp[i][j]这段是否为回文串if(len==1)dp[i][j]=true;else{if(s[i]==s[j]){if(len==2||len==3){dp[i][j]=true;}else {dp[i][j]=dp[i+1][j-1];}}}if(dp[i][j]){if(len>maxlen){maxlen=len;pos=i;}} }}// return s.substr(pos,maxlen);string res;for(int len=1;len<=L;len++){for(int i=0;i+len-1<L;i++){int j=i+len-1;if(dp[i][j])res=s.substr(i,len);}}return res;}
};
class Solution {
public:string longestPalindrome(string s) {int L=s.size();vector<vector<bool> > dp(L+1,vector<bool>(L+1,false));for(int i=0;i<L;i++)dp[i][i]=true;int pos=0;int maxlen=1;for(int len=2;len<=L;len++){for(int i=0;i+len-1<L;i++){int j=i+len-1;// dp[i][j]这段是否为回文串if(s[i]==s[j]){if(len==2||len==3){dp[i][j]=true;}else {dp[i][j]=dp[i+1][j-1];}}if(dp[i][j]){maxlen=len;pos=i;} }}return s.substr(pos,maxlen);// string res;// for(int len=1;len<=L;len++){//     for(int i=0;i<L;i++){//         int j=i+len-1;//         if(dp[i][j])res=s.substr(i,len);//     }// }// return res;}
};

97. 交错字符串⭐(抽象成路径问题)

s1s2交错组成s3,把s1s2抽象为横纵坐标,s3抽象为向右向下的路径

class Solution {
public:bool isInterleave(string s1, string s2, string s3) {int m=s1.size();int n=s2.size();if(m+n!=s3.size())return false;// "" ,"" ,"a"vector <vector<bool> > dp(m+1,vector<bool>(n+1,false));// 一些最基础的子问题的初始化处理dp[0][0]=true;for(int len=1;len<=m;len++){if(s1[len-1]==s3[len-1])dp[len][0]=true;else break;}for(int len=1;len<=n;len++){if(s2[len-1]==s3[len-1])dp[0][len]=true;else break;}for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){// dp[len1][len2] // dp[len1-1][len2] s1[len1-1]==s3[len1+len2-1]if(s1[i-1]==s3[i+j-1])dp[i][j]=dp[i-1][j];if(s2[j-1]==s3[i+j-1])dp[i][j]=dp[i][j]||dp[i][j-1];}}return dp[m][n];}
};

221. 最大正方形⭐

本来应该用三维dp表示(正方形右下角的横纵坐标,第三维为 以该坐标为右下角的所有全1正方形边长),即dp[i][j][k]表示 以 (i,j)为右下角,边长为k的正方形是否存在
dp思想,是否存在由子问题的解递推而来,如果dp[i-1][j][k-1]dp[i][j-1][k-1]dp[i-1][j-1][k-1]三者都为true,则dp[i][j][k]为true

思路来呀
在这里插入图片描述

可以优化为两维,dp[i][j]的值为int型,表示 以该坐标为右下角的所有全1正方形之中最大的边长
比如 边长为3的全1正方形区域,那么它一定包含了一个边长为2和边长为1的全1正方形区域。所以,我们只需记录以(i, j)为右下角的区域包含的最大全1正方形边长即可,这个最大边长也即以(i , j)为右下角的全1正方形的个数

class Solution {
public:
const int N=305;int maximalSquare(vector<vector<char>>& matrix) {int m=matrix.size();int n=matrix[0].size();vector<vector<int>> dp(m+1,vector<int>(n+1,0));// vector<vector<vector<bool>>> dp(N,vector<vector<bool>>(N,vector<bool>(N,false)));int mx=0;for(int i=0;i<m;i++)if(matrix[i][0]=='1')dp[i][0]=1,mx=1;for(int i=0;i<n;i++)if(matrix[0][i]=='1')dp[0][i]=1,mx=1;for(int i=1;i<m;i++){for(int j=1;j<n;j++){if(matrix[i][j]=='1'){dp[i][j]=min(min(dp[i-1][j-1],dp[i-1][j]),dp[i][j-1])+1;mx=max(mx,dp[i][j]);}}}return mx*mx;}
};

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

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

相关文章

代码随想录day8 | KMP 28.实现strStr() 459.重复的子字符串

文章目录 一、实现strStr()二、重复的子字符串 一、实现strStr() 先学学KMP算法&#xff0c;代码随想录 28.实现strStr() class Solution { public:void getNext(int* next, const string& s) {int j -1;next[0] j;for(int i 1; i < s.size(); i) { // 注意i从1开始…

微信小程序的微信一键登录与验证码登录

验证码登录 <template><view class"wx-login"><view class"login-Box"><text class"title">欢迎登录</text><text class"subTitle">再就业男团系统</text><view class"login-Form…

【算法基础:搜索与图论】3.3 拓扑排序

文章目录 拓扑排序介绍如何构造拓扑排序&#xff08;⭐重要&#xff01;&#xff09; 例题&#xff1a;848. 有向图的拓扑序列BFS 写法构造拓扑排序 相关题目练习207. 课程表&#xff08;判断是否存在拓扑序列&#xff09;bfs 写法dfs 写法 210. 课程表 II&#xff08;找到一个…

算法竞赛入门【码蹄集新手村600题】(MT1020-1040)

算法竞赛入门【码蹄集新手村600题】(MT1020-1040&#xff09; 目录MT1021 %f格式符MT1022 小数、指数MT1023 进制乱炖MT1024 进制形式MT1025 八、十六进制MT1026 合并MT1027 整数逆序MT1028 四位数逆序MT1029 位数MT1030 最大公约数MT1031 最简分数MT1032 最小公倍数MT1033 多项…

Docker 续

Docker 续 一、Docker 网络1.1 Docker 网络实现原理1.2 Docker 的网络模式1.2.1 Docker 网络模式分类 1.3 如何创建各类网络模式1.4 host模式1.5 container模式1.6 none模式1.7 bridge模式1.8 自定义网络 二、资源控制2.1 Cgroup2.2 CPU 资源控制2.2.1 设置CPU使用率上限2.2.2 …

c# Outlook检索设定问题

基于c# 设定outlook约会予定&#xff0c;时间格式是YYYY-MM-DD HH:mm 的情报。 问题发生&#xff1a; 根据开始时间&#xff08;2023/01/01 7:00&#xff09;条件查询该时间是否存在outlook信息时&#xff0c;明明存在一条数据&#xff0c;就是查询不出来数据 c#代码 Strin…

Observability:Synthetic monitoring - 动手实践

在我之前的如下文章里&#xff1a; Observability&#xff1a;Synthetic monitoring - 合成监测入门&#xff08;一&#xff09;&#xff08;二&#xff09; Observability&#xff1a;Synthetic monitoring - 创建浏览器监测&#xff0c;配置单独的浏览器监测器及项目 我详…

数据预处理matlab

matlab数据的获取、预处理、统计、可视化、降维 数据的预处理 - MATLAB & Simulink - MathWorks 中国https://ww2.mathworks.cn/help/matlab/preprocessing-data.html 一、数据的获取 1.1 从Excel中获取 使用readtable() 例1&#xff1a; 使用spreadsheetImportOption…

Vue整体架构分解

Vue.js的整体架构可以分解为以下几个部分: 文章目录 1. 数据驱动2. 组件化3. 响应式系统4. 虚拟DOM5. 插件系统6. 单文件组件7. 模板编译总结 1. 数据驱动 Vue的一个核心特点是数据驱动。Vue会在初始化的时候给数据提供一个observe监听&#xff0c;当数据变化时&#xff0c;会…

uniapp 微信小程序 input详解 带小数点的input、可查看密码的输入框input

官网文档地址 1、template <!-- 本示例未包含完整css&#xff0c;获取外链css请参考上文&#xff0c;在hello uni-app项目中查看 --> <template><view><view class"uni-common-mt"><view class"uni-form-item uni-column"&g…

【C++】开源:跨平台轻量日志库easyloggingpp

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍跨平台轻量日志库easyloggingpp。 无专精则不能成&#xff0c;无涉猎则不能通。。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&am…

详细介绍Matlab中线性规划算法的使用

Matlab中提供了用于线性规划的优化工具箱&#xff0c;其中包含了多种算法&#xff0c;如单纯形法、内点法等。线性规划是一种优化问题&#xff0c;旨在找到一组变量的最佳值&#xff0c;以最大化或最小化线性目标函数&#xff0c;同时满足一组线性约束条件。 下面将详细介绍Ma…

【C++11】智能指针的定义 和 种类 及 使用

智能指针 定义 为什么需要智能指针 在C中&#xff0c;动态分配内存是一项常见的任务&#xff0c;但手动管理分配和释放内存可能会导致很多问题&#xff0c;如内存泄漏、悬垂指针以及多次释放同一块内存等。为了避免这些问题&#xff0c;引入了智能指针的概念&#xff0c;它们…

LiveGBS流媒体平台GB/T28181功能-海康NVR摄像机自带物联网卡摄像头注册GB/T28181国标平台看不到设备的时候如何抓包及排查

海康大华宇视华为等硬件NVR摄像机注册到LiveGBS国标平台看不到设备的时候如何抓包及排查 1、设备注册后查看不到1.1、是否是自带物联网卡的摄像头1.2、关闭萤石云1.3、防火墙排查1.4、端口排查1.5、IP地址排查1.6、设备TCP/IP配置排查1.7、设备多网卡排查1.8、设备接入配置参数…

Docker(四)

文章目录 1. docker其他命令补充2. docker-registry使用3. docker-hub的使用4. 企业级私有仓库harbor4.1 harbor安装4.2 harbor配置https4.3 harbor常见使用4.3.1 harbor新建项目仓库4.3.2 harbor创建用户4.3.3 harbor仓库管理4.3.4 harbor复制管理4.3.5 harbor删除镜像 5. doc…

K8S下如何搭建eureka集群

背景 传统应用上云&#xff0c;基于传统应用需要考虑上云的方案和改造成本&#xff0c;这也是传统应用上云过程中的难点&#xff0c;本篇介绍3台eureka搭建的方案。 方案一 此方案借助了K8S中Service的一些功能。 这种方案是传统方案的简单迁移版本&#xff0c;比较易于理解…

深度学习:tf.keras实现模型搭建、模型训练和预测

在sklearn中&#xff0c;模型都是现成的。tf.Keras是一个神经网络库,我们需要根据数据和标签值构建神经网络。神经网络可以发现特征与标签之间的复杂关系。神经网络是一个高度结构化的图&#xff0c;其中包含一个或多个隐藏层。每个隐藏层都包含一个或多个神经元。神经网络有多…

【微信小程序】使用iView组件库中的icons资源

要在微信小程序中使用iView组件库中的icons资源&#xff0c;需要先下载并引入iView组件库&#xff0c;并按照iView的文档进行配置和使用。 以下是一般的使用步骤&#xff1a; 下载iView组件库的源码或使用npm安装iView。 在小程序项目的app.json文件中添加iView组件库的引入配…

mac端好用的多功能音频软件 AVTouchBar for mac 3.0.7

AVTouchBar是来自触摸栏的视听播放器&#xff0c;将跳动笔记的内容带到触摸栏&#xff0c;触摸栏可显示有趣的音频内容&#xff0c;拥有更多乐趣&#xff0c;以一种有趣的方式播放音乐&#xff0c;该软件支持多种音频播放软件&#xff0c;可在Mac上自动更改音乐~ 音频选择-与内…

Flask Bootstrap 导航条

(43条消息) Flask 导航栏&#xff0c;模版渲染多页面_U盘失踪了的博客-CSDN博客 (43条消息) 学习记录&#xff1a;Bootstrap 导航条示例_bootstrap导航栏案例_U盘失踪了的博客-CSDN博客 1&#xff0c;引用Bootstrap css样式&#xff0c;导航栏页面跳转 2&#xff0c;页面两列…