题目:
给定一个长度为 N𝑁 的数列,求数值严格单调递增的子序列的长度最长是多少?
代码:
#include<bits/stdc++.h>
using namespace std;
int dp[1010],arr[1010];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",arr+i);
}
for(int i=1;i<=n;i++){
int t=0;
for(int j=1;j<i;j++){
if(arr[j]<arr[i])t=max(t,dp[j]);
}
dp[i]=t+1;
}
int ans=0;
for(int i=1;i<=n;i++)ans=max(ans,dp[i]);
printf("%d",ans);
}
题后反思:
所求为区间范围在1~n之间的最长上升子序列,不一定包含位置为1的元素。
每一个dp[ i ]所代表的含义是以 i 位置作为结尾的子序列的长度一定包含 i 这个元素,但是不一定包含位置为1的元素。