好久没写解题报告了,最近几周好忙。。。感觉是我进大学以来最忙的一段时间了,要给新生准备下周三比赛的题目,下周五要去南京赛区,回来之后马上就要期中考试了。。。不想挂科
额,很早之前就看过关于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 ", LCIS()); 51 } 52 53 return 0; 54 }