UVa 10635 Prince and Princess / LCS 转 LIS

来源:互联网 发布:淘宝夜鹰黑搜 编辑:程序博客网 时间:2024/04/25 06:22

求LCS O(N*M)是要超时的

可以映射一下 将第一个数组变成递增的 第二个做相应的映射

然后求第二个数组的LIS就行了

求LIS可以用N*LOG(N)的二分算法

#include <stdio.h>#include <string.h>const int MAX = 250 * 250 + 10;int a[MAX];int b[MAX];int dp[MAX];int map[MAX];int main(){int cas = 1;int i,j,t,n,m,x,l,r;scanf("%d",&t);while(t--){scanf("%d %d %d", &n,&n,&m);memset(map,0,sizeof(map));for(i = 1;i <= n + 1; i++){scanf("%d",&x);map[x] = i;}n = 0;for(i = 1;i <= m + 1; i++){scanf("%d",&x);if(map[x])b[++n] = map[x];}dp[1] = b[1];int len = 1;for(i = 2;i <= n; i++){l = 1;r = len;while(l <= r){int mid = (l + r) >> 1;if(b[i] > dp[mid])l = mid + 1;elser = mid - 1;}dp[l] = b[i];if(l > len)len = l;}printf("Case %d: %d\n",cas++,len);}return 0;}


 

原创粉丝点击