转换最长公共子问题转化为最长子问题,那么增加nlogn的方式来解决这个问题最长增加子。在解决方案的整个主题的出。
#include <stdio.h> #include <algorithm> #include <map> using namespace std; typedef int NUMBER; typedef int INDEX; map<NUMBER, INDEX> m; #define INF 0x7fffffff int arr[62505]; int g[63505]; void func(int len){ static int case_n = 1; int i, p, max_len; for(i=1; i<=len; i++) g[i] = INF; max_len = -1; for(i=1; i<=len; i++){ p = lower_bound(g+1, g+i, arr[i])-g; if(max_len < p) max_len = p; g[p] = arr[i]; } printf("Case %d: %d ", case_n++, max_len); } int main(void){ int t, n, p, q, i, num; //freopen("input.dat", "r", stdin); scanf("%d", &t); while(t--){ scanf("%d %d %d", &n, &p, &q); for(i=1; i<=p+1; i++){ scanf("%d", &num); m[num] = i; } for(i=1; i<=q+1; i++){ scanf("%d", &num); arr[i] = m[num]; } func(q+1); } return 0; }
版权声明:本文博客原创文章,博客,未经同意,不得转载。