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

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

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;
    }
};


完结撒花:


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

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


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


🌈诸君,山顶见!

目录
相关文章
|
6月前
代码随想录 Day46 动态规划14 LeetCode T392 判断子序列 T115 不同的子序列
代码随想录 Day46 动态规划14 LeetCode T392 判断子序列 T115 不同的子序列
62 0
【动态规划刷题 15】最长定差子序列&& 最长的斐波那契子序列的长度
【动态规划刷题 15】最长定差子序列&& 最长的斐波那契子序列的长度
|
测试技术
代码随想录Day24 LeetCode T491 递增子序列 LeetCode T46 全排列 LrrtCode T47 全排列II
代码随想录Day24 LeetCode T491 递增子序列 LeetCode T46 全排列 LrrtCode T47 全排列II
37 1
|
6月前
|
JavaScript
代码随想录 Day48 动态规划16 T647 回文子串 T516最长回文子序列
代码随想录 Day48 动态规划16 T647 回文子串 T516最长回文子序列
42 0
|
6月前
|
机器学习/深度学习 算法
【动态规划刷题 17】回文子串&& 最长回文子串
【动态规划刷题 17】回文子串&& 最长回文子串
|
Java 测试技术
hdu1231 最大连续子序列【动态规划】
hdu1231 最大连续子序列【动态规划】
36 0
|
算法 C语言 C++
【动态规划】最长上升子序列(单调队列、贪心优化)
本篇是对最长上升子序列基础做法的一种优化
66 0
[leetcode] 522. 最长特殊序列 II 暴力 + 双指针
[leetcode] 522. 最长特殊序列 II 暴力 + 双指针
92 0
|
算法 Java Python
【LeetCode】 53. 最大子序和(动态规划)
53. 最大子序和(动态规划)
97 0
【LeetCode】 53. 最大子序和(动态规划)
最长递增子序列(力扣)图解
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
94 0
最长递增子序列(力扣)图解