Description


Input
Output
Sample Input
3 6 6 1 3 1 3 1 3 3 1 3 1 3 1 4 4 1 1 3 3 1 1 3 3 12 11 1 2 3 3 2 4 1 5 1 3 5 10 3 1 2 3 2 4 12 1 5 5 3
Sample Output
6 0 8
Source
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <bitset>
#include <algorithm>
#include <climits>
using namespace std;
#define ls 2*i
#define rs 2*i+1
#define up(i,x,y) for(i=x;i<=y;i++)
#define down(i,x,y) for(i=x;i>=y;i--)
#define mem(a,x) memset(a,x,sizeof(a))
#define w(a) while(a)
#define LL long long
const double pi = acos(-1.0);
#define N 505
#define mod 19999997
#define INF 0x3f3f3f3f
#define exp 1e-8
int t,n,m,a[105],b[105],dp[105][105];
int main()
{
int i,j,k;
scanf("%d",&t);
w(t--)
{
scanf("%d%d",&n,&m);
up(i,1,n)
scanf("%d",&a[i]);
up(i,1,m)
scanf("%d",&b[i]);
mem(dp,0);
up(i,2,n)
{
up(j,2,m)
{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
if(a[i]!=b[j])
{
int k1=0,k2=0;
down(k1,i-1,1)
if(a[k1]==b[j])
break;
down(k2,j-1,1)
if(b[k2]==a[i])
break;
if(k1&&k2)
dp[i][j]=max(dp[i][j],dp[k1-1][k2-1]+2);
}
}
}
printf("%d\n",dp[n][m]);
}
return 0;
}
原文:http://blog.csdn.net/libin56842/article/details/45674139