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));//0123
                    if(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]);
else
 swap(*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;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文心千帆为你而来

1. 前言 3月16号百度率先发布了国内第一个人工智能大语言模型—文心一言。文心一言的发布在业界引起了不小的震动。而文心一言的企业服务则由文心千帆大模型平台提供。文心千帆大模型平台是百度智能云打造出来的一站式大模型开发与应用平台&#xff0c;提供包括文心一言在内的…

Observability:Synthetic monitoring - 动手实践

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

408-2009

一、选择题&#xff08;2 分/题&#xff09; 1.为解决计算机主机与打印机之间速度不匹配问题&#xff0c;通常设置一个打印数据缓冲区&#xff0c;主机将要输出的数据一次写入该缓冲取&#xff0c;而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是______。 A.栈 …

【JavaEE】Servlet常用的API

目录 前言 一、HttpServlet类 1、Servlet的生命周期 ✨tomcat的两个端口 ✨设置告诉浏览器使用那种字符集解析响应 ✨Java中Unicode和utf8字符集的使用 二、HttpServletRequest类 1、获取请求的信息 2、 前端给后端传递数据的三种方式 2.1、通过query string传递 2.2…

【云原生】Prometheus 监控系统的初步了解与系统搭建

前言 promethues是一个开源的系统监控和报警系统&#xff0c;现在已经加入到CNCF基金会&#xff0c;成为继k8s之后第二个在CNCF托管的项目&#xff0c;在kubernetes容器管理系统中&#xff0c;通常会搭配prometheus进行监控&#xff0c;同时也支持多种exporter采集数据&#x…

S32K144 GPIO外设分析

1. S32K144 GPIO外设特性 下面的内容来自于S32K用户手册的翻译&#xff0c;或者网上关于S32K系列的一些pdf文件介绍。有些内容可能会出现理解不到位或者翻译错误方面&#xff0c;如果大家有疑问最好可以查阅用户手册。 GPIO和PORT的数量 从用户手册&#xff0c;对于PCR&#x…

【广州华锐互动】列车人员疏散VR虚拟演练系统

随着科技的不断发展&#xff0c;虚拟现实(VR)技术已经逐渐应用于各个领域。在火车站安全方面&#xff0c;为了提高旅客的安全意识和应对突发事件的能力&#xff0c;列车人员疏散VR虚拟演练系统应运而生。 列车人员疏散VR虚拟演练系统是一种基于虚拟现实技术的教育培训系统&…

15 QMessageBox消息对话框

错误提示对话框 信息提示对话框 循环对话框 默认是Yes和No&#xff0c;可以修改属性。第5个参数关联回车键 QMessageBox::Save | QMessageBox::Cancel 可以通过捕获按键获取点击结果 警告提示 代码&#xff1a; //QMessageBox 消息对话框//错误提示QMessageBox::critical(th…

老年公寓人员定位管理系统:提升安全与关怀的智能解决方案

老年公寓作为提供安全居住环境和关怀服务的重要场所&#xff0c;面临着人员管理和安全控制的挑战。为了解决这些问题&#xff0c;老年公寓人员定位管理系统应运而生。基于为提供全面的安全管理和个性化关怀服务&#xff0c;华安联大便通过老年公寓人员定位管理系统的技术原理、…

[数据结构 -- C语言] 二叉树(BinaryTree)

目录 1、树的概念及结构 1.1 树的概念 1.2 树的相关概念&#xff08;很重要&#xff09; 1.3 树的表示 2、二叉树的概念及结构 2.1 概念 2.2 特殊二叉树 2.3 二叉树的性质&#xff08;很重要&#xff09; 2.4 练习题 2.5 二叉树的存储结构 2.5.1 顺序存储 2.5.2 链…

微服务保护——Sentinel【快速入门】

一、雪崩问题&#x1f349; (一) 什么是雪崩&#x1f95d; 微服务调用链路中的某个服务故障&#xff0c;引起整个链路中的所有微服务都不可用&#xff0c;这就是雪崩。服务D故障引起服务A故障&#xff0c;服务A引起其他服务故障&#xff0c;渐渐导致所有微服务都不可用。有人…

基础算法(三)

目录 一、双指针算法 二、位运算 三、区间合并 一、双指针算法 双指针算法模板: for(int i 0,j 0;i < n;i) {while(j < i && check(i,j)) j;//每道题的具体逻辑 } 1.1两个指针指向两个队列1.2两个指针指向一个队列 案例习题: 分割字符串 #include<…

4-2 3D images: Volumetric data Representing tabular data

本文所用到的资料下载地址 By stacking individual 2D slices into a 3D tensor, we can build volumetric data representing the 3D anatomy of a subject. We just have an extra dimension, depth, after the channel dimension, leading to a 5D tensor of shape N C D…

[MySQL]MySQL事务特性

[MySQL]MySQL事务 文章目录 [MySQL]MySQL事务1. 事务的概念2. 为什么会出现事务3. 事务的版本支持4. 事务的提交方式5. 事务常见操作方式6. 事务隔离级别事务隔离级别概念查看事务的隔离级别设置事务的隔离级别读未提交&#xff08;Read Uncommitted&#xff09;读提交&#xf…

【力扣算法20】之 8. 找出字符串中第一个匹配项的下标 (python方向)

文章目录 问题描述示例1示例2提示 思路分析代码分析完整代码详细分析运行效果截图调用示例运行结果 完结 问题描述 给你两个字符串 haystack 和 needle &#xff0c;请你在haystack字符串中找出needle字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 n…

htmlCSS-----浮动

目录 前言&#xff1a; 浮动 1.浮动的效果 2.浮动的特点 3.浮动的写法 4.浮动的原理 5.浮动的作用 6.案例 7.浮动的缺陷与解决方式 浮动问题 解决方式 8.补充说明 前言&#xff1a; 浮动是html里面重要的一部分&#xff0c;前面我们学习了三种元素的类型&#xff08;…

计科web常见错误排错【HTTP状态404、导航栏无法点开、字符乱码及前后端数据传输呈现、jsp填写的数据传到数据库显示null、HTTP状态500】

web排错记录 在使用javaweb的过程中会出现的一些错误请在下方目录查找。 目录 错误1&#xff1a;HTTP状态404——未找到 错误2&#xff1a;导航栏下拉菜单无法点开的问题 错误3&#xff1a;字符乱码问题 错误4&#xff1a;jsp网页全部都是&#xff1f;&#xff1f;&#x…

Golang并发控制

开发 go 程序的时候&#xff0c;时常需要使用 goroutine 并发处理任务&#xff0c;有时候这些 goroutine 是相互独立的&#xff0c;需要保证并发的数据安全性&#xff0c;也有的时候&#xff0c;goroutine 之间要进行同步与通信&#xff0c;主 goroutine 需要控制它所属的子gor…

Linux系统安装部署MySQL完整教程(图文详解)

前言&#xff1a;最近网上翻阅了大量关于Linux安装部署MySQL的教程&#xff0c;在自己部署的时候总是存在一些小问题&#xff0c;例如&#xff1a;版本冲突&#xff0c;配置失败和启动失败等等&#xff0c;功夫不负有心人&#xff0c;最后还是安装部署成功了&#xff0c;所以本…

Ubuntu 网络配置指导手册

一、前言 从Ubuntu 17.10 Artful开始&#xff0c;Netplan取代ifupdown成为默认的配置实用程序&#xff0c;网络管理改成 netplan 方式处理&#xff0c;不在再采用从/etc/network/interfaces 里固定 IP 的配置 &#xff0c;配置写在 /etc/netplan/01-network-manager-all.yaml 或…