Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。
🌈个人主页:主页链接
🌈算法专栏:专栏链接
我会一直往里填充内容哒!
🌈LeetCode专栏:专栏链接
目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出
🌈代码仓库:Gitee链接
🌈点击关注=收获更多优质内容🌈
介绍了动态规划相关的题目与题解.
目录
题目:最长上升子序列
题解:
代码实现:
题目:最大子数组和
题解:
代码实现:
完结撒花:
题目:最长上升子序列
题解:
首先进行分析,这题的状态是什么?
状态为:前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;
}
题目:最大子数组和
题解:
拿到题目也首先分析,这题的状态是什么?
找出一个具有最大和的连续数组,细看一下和上面那题十分的像.但这题要求得是连续的子数组
这题似乎也能用滑动窗口来做?
是不能的,因为有负数滑动窗口作左区间的无法判断何时进行缩进.
所以这里的状态为前i个数字中相加子数组的最大值.
也就是每一个dp[i]存储的都是之前的最优解
所以我们要考虑的就是 当前第i位的数字,是用他本身,还是加上之前的dp[i-1]后再加它本身.(本身是一定要加的,不然就不连续了).这就是我们的属性
所以状态方程为 dp[i]=max(nums[i],dp[i-1]+nums[i])
例如:
代码实现:
#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;
}
};
完结撒花:
🌈本篇博客的内容【动态规划:最长上升子序列、最大子数组和题解及代码实现】已经结束。
🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。
🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。
🌈诸君,山顶见!