本题明白题意以后,就可以看出是让求最长上升子序列,但是不知道最长上升子序列的算法,用了很多YY的方法去做,最后还是超时,
因为普通算法时间复杂度为O(n*2),去搜了题解,学习了一下,感觉不错,拿出来分享一下。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 #include <string.h> 3 4 #define N 500005 5 int map[N], dp[N]; 6 7 int main () 8 { 9 int x, y, n, i, j = 0; 10 11 while (scanf ("%d", &n) != EOF) 12 { 13 for (i=0; i<n; i++) 14 { 15 scanf ("%d %d", &x, &y); 16 map[x] = y; 17 } 18 19 memset (dp, 0, sizeof(dp)); 20 21 dp[1] = map[1]; 22 23 int low, up, mid, len = 1; 24 for (i=2; i<=n; i++) 25 { 26 low = 1; 27 up = len; 28 29 while (low <= up) 30 { 31 mid = (low + up) / 2; 32 if (dp[mid] > map[i]) 33 up = mid - 1; 34 else 35 low = mid + 1; 36 } 37 38 dp[low] = map[i]; 39 if (low > len) 40 len ++; 41 } 42 if (len == 1) 43 printf ("Case %d: My king, at most 1 road can be built. ", ++j); 44 else 45 printf ("Case %d: My king, at most %d roads can be built. ", ++j, len); 46 } 47 48 return 0; 49 }