poj 1692 Crossed Matchings

来源:互联网 发布:越南女孩 知乎 编辑:程序博客网 时间:2024/04/26 21:14

题目链接:http://poj.org/problem?id=1692

题目思路:转移方程:dp[i][j]=max(dp[i-1][j],dp[i][j-1],dp[up[i][j]-1][down[i][j]-1]+2) (其中up[i][j]为第一行中前i-1个数与第2行的第j行数相同的编号最大的数,down 类似)。

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<string>#include<queue>#include<algorithm>#include<vector>#include<stack>#include<list>#include<iostream>#include<map>using namespace std;#define inf 0x3f3f3f3f#define Max 110int max(int a,int b){return a>b?a:b;}int min(int a,int b){return a<b?a:b;}int up[Max][Max],down[Max][Max],dp[Max][Max];int a[Max],b[Max];int n,m,t;int main(){    scanf("%d",&t);    int i,j;    while(t--)    {        scanf("%d%d",&n,&m);        for(i=1;i<=n;i++)            scanf("%d",&a[i]);        for(i=1;i<=m;i++)            scanf("%d",&b[i]);        memset(up,-1,sizeof(up));        memset(down,-1,sizeof(down));        for(i=2;i<=n;i++)            for(j=2;j<=m;j++)            {                if(a[i-1]==b[j])                    up[i][j]=i-1;                else                    up[i][j]=up[i-1][j];                if(a[i]==b[j-1])                    down[i][j]=j-1;                else                    down[i][j]=down[i][j-1];              //  printf("i %d j %d up %d\n",i,j,up[i][j]);            }        dp[0][0]=0;        dp[0][1]=0;        dp[1][0]=0;        for(i=1;i<=n;i++)            for(j=1;j<=m;j++)            {                dp[i][j]=max(dp[i-1][j],dp[i][j-1]);                if(a[i]!=b[j]&&up[i][j]!=-1&&down[i][j]!=-1)                {                    dp[i][j]=max(dp[i][j],dp[up[i][j]-1][down[i][j]-1]+2);                }            }        printf("%d\n",dp[n][m]);    }}


 

原创粉丝点击