最长不下降子序列
时间: 1000ms / 空间: 131072KiB / Java类名: Main
描述
求最长不下降子序列的长度
输入格式
第一行为n,表示n个数
第二行n个数
输出格式
最长不下降子序列的长度
测试样例1
输入
3
1 2 3
输出
3
备注
N小于5000
for each num <=maxint
由N小于5000可知可以使用蛋疼的平方算法。
那么首先,我们都知道对于一个数列来讲,不下降子序列最短的的长度肯定是1。
那么我们设置一个f[i],表示以第i个数为结尾的最长不下降子序列是多少
(a[i],a[j]表示第i个或者第j个元素)那么对于每一个比i小的j,如果存在a[i]>=a[j]那么我们就f[i] = max(f[i],f[j]+1)
//循环先i后j,国际惯例, i = 1->n j 就是 1-> i-1
//答案要从1->n里面找,不能就输出最后一个
//别忘了调用dp
//j<=i-1已经保证j<i了,不要再判断一次了
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int n,a[5005]; int f[5005]; int dp()//buxiajiang { // if(x==y)return f[x]; for(int i=1;i<=n;i++) { for(int j=1;j<=i-1;j++) { if(a[i]>=a[j]) { f[i]=max(f[i],f[j]+1); } } } } int main() { cin>>n; // memset(f,0,sizeof(f)); for(int i=0;i<=n;i++)f[i]=1; for(int i=1;i<=n;i++)scanf("%d",&a[i]); dp(); sort(f+1,f+1+n); cout<<f[n]; puts(""); return 0; }
蠢哭的代码酱n^2做法
时间: 2024-10-27 13:38:38