最长上升子序列
解: 同样是动态规划入门的题目,我们用一个数组f[i]来表示在序列中,第i位以前最长的上升子序列,用这个部分解来推算全部的解。
对于第i个数时,我们考虑前i-1个数中的末尾小于arr[i]的最长子序列 ,取max即可, 详情见代码。
#include <iostream>
#include <stdio.h>
using namespace std;
const int N = 1200;
int main()
{
ios::sync_with_stdio(0);
int n,m;
int arr[N],f[N];
cin>>n;
for(int i=0;i<n;i++){
cin>>arr[i];
f[i]=1;
}
int na=1;
for(int i=0;i<n;i++){
for(int j=0;j<i;j++){
if(arr[j]<arr[i])f[i]=max(f[i],1+f[j]),na=max(na,f[i]);
}
}
cout<<na<<endl;
return 0;
}