UVA 10635 Prince and Princess (最长公共子序列+最长上升子序列)
2016-05-10 22:35
513 查看
题目大意:
给定两串数字序列,每串数字都不重复,求两串序列的最长公共序列。
解题:
求两序列的复杂度为n^2,可以转换为求构造后的序列的最长上升子序列,复杂度转换为Nlog(N)。可以参考这篇博客LCS最长公共子序列
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
int pos[70000],a[70000],b[70000],arr[70000],val[70000],d[70000],cnt,len;
int binary_search(int i)
{
int left,right,mid;
left=0,right=len;
while(left<right){
mid = left+(right-left)/2;
if(d[mid]>=arr[i]) right=mid;
else left=mid+1;
}
return left;
}
int LIS()
{
d[1] = arr[1];
len=1;
for(int i=2; i<cnt; ++i)
{
if(arr[i]>d[len])
d[++len]=arr[i];
else{
int p=binary_search(i);
d[p] = arr[i];
}
}
return len;
}
int main()
{
int t,x,m,n;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
cnt=1;
memset(pos,-1,sizeof(pos));
scanf("%d%d%d",&x,&m,&n);
for(int j=1;j<=m+1;j++)
scanf("%d",&a[j]);
for(int j=1;j<=n+1;j++)
scanf("%d",&b[j]);
for(int j=1;j<=n+1;j++)
pos[b[j]]=j;
for(int j=1;j<=m+1;j++)
{
if(pos[a[j]]!=-1)
arr[cnt++]=pos[a[j]];
}
printf("Case %d: %d\n",i,LIS());
}
}
给定两串数字序列,每串数字都不重复,求两串序列的最长公共序列。
解题:
求两序列的复杂度为n^2,可以转换为求构造后的序列的最长上升子序列,复杂度转换为Nlog(N)。可以参考这篇博客LCS最长公共子序列
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
int pos[70000],a[70000],b[70000],arr[70000],val[70000],d[70000],cnt,len;
int binary_search(int i)
{
int left,right,mid;
left=0,right=len;
while(left<right){
mid = left+(right-left)/2;
if(d[mid]>=arr[i]) right=mid;
else left=mid+1;
}
return left;
}
int LIS()
{
d[1] = arr[1];
len=1;
for(int i=2; i<cnt; ++i)
{
if(arr[i]>d[len])
d[++len]=arr[i];
else{
int p=binary_search(i);
d[p] = arr[i];
}
}
return len;
}
int main()
{
int t,x,m,n;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
cnt=1;
memset(pos,-1,sizeof(pos));
scanf("%d%d%d",&x,&m,&n);
for(int j=1;j<=m+1;j++)
scanf("%d",&a[j]);
for(int j=1;j<=n+1;j++)
scanf("%d",&b[j]);
for(int j=1;j<=n+1;j++)
pos[b[j]]=j;
for(int j=1;j<=m+1;j++)
{
if(pos[a[j]]!=-1)
arr[cnt++]=pos[a[j]];
}
printf("Case %d: %d\n",i,LIS());
}
}
相关文章推荐
- 1.10055 - Hashmat the brave warrior
- 2.10071 - Back to High School Physics
- 3.458 - The Decoder
- 4.694 - The Collatz Sequence
- 6.494 - Kindergarten Counting Game
- 7.490 - Rotating Sentences
- 8.414 - Machined Surfaces
- 9.488 - Triangle Wave
- A.457 - Linear Cellular Automata
- B.489 - Hangman Judge
- C.445 - Marvelous Mazes
- 1.10494 - If We Were a Child Again
- 2.424 - Integer Inquiry
- 3.10250 - The Other Two Trees
- 5.465 - Overflow
- 6.113 - Power of Cryptography
- 7.10161 - Ant on a Chessboard
- 8.621 - Secret Research
- 9.401 - Palindromes
- A.537 - Artificial Intelligence?