[关闭]
@xunuo 2016-08-13T10:45:32.000000Z 字数 647 阅读 1110

最长上升子序列之基础

swustpoweroj 1180     
Time Limit:1000MS Memory Limit:65536KB

动态规划(DP)


Description

给出一个由n个数组成的序列x[1..n],找出它的最长单调上升子序列的长度。
即找出最大的长度m和a1,a2……,am,使得 a1 < a2 < … … < am且 x[a1] < x[a2] < … … < x[am]。

Input

先输入一个整数t(t<=200),代表测试组数。
每组数据先输入一个N,代表有N个数(1<=N<=1000).
输入N个正整数,a1,a2,a3.....an(0<=ai<=100000).

Output

每组输出一个整数,代表最长的长度。

Sample input

1
7
1 7 3 5 9 4 8

Sample Output

4

完整代码:

  1. #include<stdio.h>
  2. #include<algorithm>
  3. using namespace std;
  4. int a[10010],f[10010];
  5. int main()
  6. {
  7. int t;
  8. scanf("%d",&t);
  9. while(t--)
  10. {
  11. int n,x,i,j,m=-1;
  12. scanf("%d",&n);
  13. for(i=0;i<n;i++)
  14. f[i]=1;
  15. for(i=0;i<n;i++)
  16. scanf("%d",&a[i]);
  17. for(i=0;i<n;i++)
  18. {
  19. for(j=0;j<i;j++)
  20. if(a[j]<a[i])
  21. f[i]=max(f[i],f[j]+1);
  22. m=max(m,f[i]);
  23. }
  24. printf("%d\n",m);
  25. }
  26. return 0;
  27. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注