hdu 4512 (LCIS)

好久没写解题报告了,最近几周好忙。。。感觉是我进大学以来最忙的一段时间了,要给新生准备下周三比赛的题目,下周五要去南京赛区,回来之后马上就要期中考试了。。。不想挂科大哭

 

额,很早之前就看过关于LCIS的题目,但是依然理解不了,昨天在网上找了一些资料,我就直接看了那个O(n^2)的解法,有点小懂,但是对于其中的精髓依然陌生,我估计我只是记住了代码。。并不是真正的理解。不过慢慢来,加油!!

 

这道题,看完题目就可以知道是LCIS这种类型的,但是有个不好搞的地方就是如何判断前后两部分有无公共部分,也就是所选出的队伍中的人数是奇数还是偶数。

a[i], b[j], 本题中b[]就是a[]的倒序。

f[j]表示以b[j]为结尾的LCIS的最大长度。枚举断点将原队列分成两个队列再求两个队列的LCIS即可。

 

 1 /*

 2 

 3  * 2013年10月27日13时40分10秒

 4  * LCIS的变形

 5  */

 6 #include <stdio.h>

 7 #include <string.h>

 8 

 9 #define max(x, y) ((x)>(y)?(x):(y))

10 

11 int a[205], f[205], n;

12 

13 int LCIS(){

14     memset(f, 0, sizeof(f));

15     int i, j, k, ans=0;

16     for (i=n; i>=1; i--) {

17         k = 0;

18         for (j=1; j<=i; j++) {

19             if (a[i] == a[j]) {

20                 if (f[j] < f[k]+1) {

21                     f[j] = f[k]+1;

22                 }

23             }

24             else if (a[i] > a[j]) {

25                 if (f[k] < f[j]) {

26                     k = j;

27                 }

28             }

29             if (j < i) {

30                 ans = max(ans, f[j]*2);

31             }

32             else {

33                 ans = max(ans, f[j]*2-1);

34             }

35         }

36     }

37 

38     return ans;

39 }

40 

41 int main(void){

42     int t;

43     scanf("%d", &t);

44     while (t--) {

45         scanf("%d", &n);

46         int i;

47         for (i=1; i<=n; i++) {

48             scanf("%d", &a[i]);

49         }

50         printf("%d\n", LCIS());

51     }

52 

53     return 0;

54 }

 

 

你可能感兴趣的:(HDU)