最长不下降子序列(LIS)问题解题思路
题目描述:![](https://img2020.cnblogs.com/blog/2729601/202201/2729601-20220118170729321-807172676.png)
要解决这个问题,我们就得明白这个问题用什么思路来解决,无非就是一个一个判断是否符合标准。主要就是这一个动态转移方程式:
a[i]>=a[j]&&(dp[j]+1>dp[i])
在判断后,如果是,则将其设置为之前的数加一:
dp[i]=dp[j]+1;
在每次子循环后,将最大数设为答案:
ans=max(ans,dp[i]);
接下来,整个程序就简单了,再在前面加上数据输入,后面加上输出就完事了,上代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int a[1000]; 4 int dp[1000]; 5 int main(){ 6 int n; 7 cin>>n; 8 for(int i=1;i<=n;i++){ 9 cin>>a[i]; 10 }int ans=0;//初始化 11 for(int i=1;i<=n;i++){ 12 dp[i]=1;//先设置好起始点(假设都是) 13 for(int j=1;j<i;j++){ 14 if(a[i]>=a[j]&&(dp[j]+1>dp[i])){//判断是否符合不下降子序的标准 15 dp[i]=dp[j]+1;//如果是,则将其设置为之前的数加一 16 } 17 }ans=max(ans,dp[i]);//将最大数设为答案 18 }cout<<ans;//打印 19 return 0; 20 }