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

再解问题前,我们先看题目:

 我们模拟一下程序的运行过程。可以看到a数组中的 -1 对应dp数组的是1,是因为在a数组中-1的前面没有比-1小的数,而a数组中的3对应的dp数组是3,是因为在3的前面(包括它自己)有3个<=它的数(1和2)。后面的以此类推。

这个问题的状态转移方程是:

1 if(a[i]>=a[j]&&(dp[j]+1>dp[i]))//状态转移方程
2 {
3     dp[i]=dp[j]+1;//执行的操作
4 }

 

 

完整程序是这样的(32_4_2):

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a[1001];//这个数组存储输入的数据 
 4 int dp[1001];
 5 int main()
 6 {
 7     int n=0;
 8     cin>>n;//设置数组长度 
 9     for(int i=1;i<=n;i++)
10     {
11         cin>>a[i];//输入数组的值 
12     }
13     int ans=0;//这个变量用来比较dp数组中哪个值最大 
14     for(int i=1;i<=n;i++)
15     {
16         dp[i]=1;
17         for(int j=1;j<i;j++)
18         {
19             if(a[i]>=a[j]&&(dp[j]+1>dp[i]))//判断是否符合标准 
20             {
21                 dp[i]=dp[j]+1;//将符合标准的值存入dp数组 
22             }
23         }
24         ans=max(dp[i],ans);//比较上一次判断的值与这一次判断的值,并将最大的存入ans变量 
25     }
26     cout<<ans;//输出dp数组中最大的值(最长不下降值) 
27     return 0;
28 }

 

posted @ 2022-01-20 17:07  苏鹤鸣shm  阅读(77)  评论(0)    收藏  举报