- 题目链接:最长上升子序列
- 考查知识:动态规划
- 题意描述:从给出的数列中找到它的最长上升子序列长度
- 思路简析:
- 这里的子序列是不连续的,如截取位序136得到的一个长度为3的子序列
- dp[i]为以a[i]结尾的最长不下降子序列数
- 两重循环遍历序列,第一重循环赋dp[i]初值为1,假设每个元素自成一个子序列
- 第二重遍历i前的所有元素,如果满足上升序列a[j]<=a[i],且需要更新dp[j]+1>dp[i]时,我们对其更新即可。
- 具体代码
#include<bits/stdc++.h> using namespace std; const int N=1e3+10; int a[N],dp[N];//dp[i]为以a[i]结尾的最长不下降子序列数,时间复杂度为O(n^2) int main(){ int n; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } int mx=-1;//记录最大的dp[i] for(int i=1;i<=n;i++){ dp[i]=1;//边界初始条件(假设每个元素自成一个子序列) for(int j=1;j<i;j++){ if(a[j]<=a[i]&&(dp[j]+1>dp[i]))dp[i]=dp[j]+1;//状态转移方程,如果前一个数字<=后一个,且前一状态序列数加当前一个数>当前序列数,即需要更新时则更新 } mx=max(mx,dp[i]); } cout<<mx; return 0; }
最长上升子序列(动态规划)
于 2022-04-08 21:55:06 首次发布