最长不下降子序列(LIS)问题解题思路

题目描述:

要解决这个问题,我们就得明白这个问题用什么思路来解决,无非就是一个一个判断是否符合标准。主要就是这一个动态转移方程式:

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 }

 

posted @ 2022-01-18 16:53  冯子坤  阅读(62)  评论(0编辑  收藏  举报