最长不下降子序列(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 }

浙公网安备 33010602011771号