题意
本题求从1 到 n的最长上升子序列的长度
分析
最优化问题
考虑dp
我们求1-n最长上升子序列长度
假设记录在dp[n]中
假设我们已经知道了1—n-1的以第n-1为最后一个元素的最长上升序列的长度
那么我们拿到第n个元素不就可以判断如果这个n比n-1位置上的元素大
那么就让dp[n] = dp[n-1]+1不就可以了吗
那么dp[n-1]又怎么得到
我们需要得到dp[n-2]
那么dp[n-2]咋知道 我们需要dp[n-3]。。。
所以我们不如从前面开始推
设置dp数组 dp[i]表示以第I个元素为结尾的从1到n最长上升子序列的长度
也就是我们要从第一个元素x开始向后扫
如果后面的元素比x大 那么就让dp[I] = dp[1]+1;
那么这里我们看到需要把dp[i]全部都初始化为1
只有这样才能得到正确累计的数量
可是我们发现 如果每个元素都做此相同步骤
我们需要考虑就是如果这个dp[i]本来就比dp[枚举元素]+1 大 我们就不能直接赋值了
因为这个元素可能已经被前面的某些元素已经搞得比较大了
所以我们得到最终的递推关系
dp[j]=max(dp[j],dp[i]+1);
CODE
#include<bits/stdc++.h>
using namespace std;
int a[1010],dp[1010];int main()
{int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);dp[i]=1;}for(int i=1;i<n;i++){for(int j=i+1;j<=n;j++){if(a[j]>a[i])dp[j] = max(dp[i]+1,dp[j]);}}int ans=-1;for(int i=1;i<=n;i++){ans = max(dp[i],ans);}printf("%d\n",ans);return 0;
}