【动态规划】最长上升子序列、最大子数组和题解及代码实现

简介: 首先进行分析,这题的状态是什么?

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。


🌈个人主页:主页链接


🌈算法专栏:专栏链接


    我会一直往里填充内容哒!


🌈LeetCode专栏:专栏链接


目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出


🌈代码仓库:Gitee链接


🌈点击关注=收获更多优质内容🌈


06ac5f86561e4df6a13877f8b195804a.jpg


介绍了动态规划相关的题目与题解.


题目:最长上升子序列


28ad0bfaace241db83943adf13165acf.png


题解:


首先进行分析,这题的状态是什么?


状态为:前i个上升子序列的长度.


属性为:max(因为题目为最长)


所以令dp[i]初始化为1(本身也是一个长度)


之后循环遍历前i个字符,若发现其满足a[j]<a[i] 则更新子序列


状态方程为:dp[i]=max(dp[i],dp[j]+1]

代码实现:


#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
int a[N];
int f[N];
int main()
{
    int n=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=n;i++)
    {
        f[i]=1;
        for(int j=1;j<i;j++)
        {
            if(a[i]>a[j])f[i]=max(f[j]+1,f[i]);
        }
    }
    int res=-1e9-100;
    for(int i=1;i<=n;i++)res=max(res,f[i]);
    cout<<res;
}


题目:最大子数组和


a1e0518fd29849c7acb21e58bd604146.png


题解:


拿到题目也首先分析,这题的状态是什么?


找出一个具有最大和的连续数组,细看一下和上面那题十分的像.但这题要求得是连续的子数组


这题似乎也能用滑动窗口来做?


是不能的,因为有负数滑动窗口作左区间的无法判断何时进行缩进.


所以这里的状态为前i个数字中相加子数组的最大值.


也就是每一个dp[i]存储的都是之前的最优解


所以我们要考虑的就是 当前第i位的数字,是用他本身,还是加上之前的dp[i-1]后再加它本身.(本身是一定要加的,不然就不连续了).这就是我们的属性


所以状态方程为 dp[i]=max(nums[i],dp[i-1]+nums[i])

例如:


77df8cd1f11f4b63904aa7a972f3824e.jpg


 e24e00a8ab9a438ab78fbad4719b2c63.jpg


代码实现:


#include <algorithm>
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        vector<int>ans(nums.size()+1);
        if(nums.size()==0)return 0;
        ans[1]=nums[0];
        for(int i=1;i<ans.size();i++)
        {
            ans[i]=nums[i-1];
            ans[i]=max(ans[i],ans[i-1]+nums[i-1]);
        }
        int t=-1e5;
        for(int i=1;i<ans.size();i++)
        {
            if(ans[i]>t)t=ans[i];
        }
        return t;
    }
};


完结撒花:


🌈本篇博客的内容【动态规划:最长上升子序列、最大子数组和题解及代码实现】已经结束。

🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。


🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。


🌈诸君,山顶见!

目录
相关文章
|
存储 分布式计算 数据管理
基于 Apache Hudi + dbt 构建开放的Lakehouse
基于 Apache Hudi + dbt 构建开放的Lakehouse
312 3
|
Ubuntu 网络协议 Linux
使用云服务器第一次实现了我的泰拉瑞亚服务器
使用云服务器实现泰拉瑞亚游戏的联机功能
使用云服务器第一次实现了我的泰拉瑞亚服务器
|
缓存 负载均衡 应用服务中间件
nginx.conf 配置解析及常用配置
nginx.conf 配置解析及常用配置
394 6
java交换两个数字三种方法
java交换两个数字三种方法
831 0
|
图形学
【unity实战】实现一个buff系统(附项目源码)
【unity实战】实现一个buff系统(附项目源码)
1207 0
|
安全 Shell PHP
pear文件利用 (远程文件下载、生成配置文件、写配置文件) 从一道题看——CTFshow私教 web40
pear文件利用 (远程文件下载、生成配置文件、写配置文件) 从一道题看——CTFshow私教 web40
747 0
|
存储 机器学习/深度学习 自然语言处理
Mini but Mighty | 简直就是微调ViT神器,有了Mimi微调方法,别的不用选了!又稳又快!
Mini but Mighty | 简直就是微调ViT神器,有了Mimi微调方法,别的不用选了!又稳又快!
588 1
|
人工智能 安全 网络安全
python运营商身份证二要素查验接口、身份证实名认证接口
翔云身份证二要素实名认证接口,实时联网,通过网民用户提供身份证号+姓名的核验方式确保交易与服务过程中的用户身份真实性是保障网络安全、防范欺诈行为的关键步骤。
如何用牛顿法求一个数的平方根
(一)导数与导函数 导数 设函数y=f(x)在点x0的某个邻域内有定义,当自变量x在x0处有增量Δx,(x0+Δx)也在该邻域内时,相应地函数取得增量Δy=f(x0+Δx)-f(x0);如果Δy与Δx之比当Δx→0时极限存在,则称函数y=f(x)在点x0处可导,并称这个极限为函数y=f(x)在点x0处的导数记作①f'(x0) ;②y'│x=x0 ;③ │x=x0, 即 导函数 如果函数y=f(x)在开区间内每一点都可导,就称函数f(x)在区间内可导。
4591 1