ZOJ1425 POJ1692 Crossed Matchings

原创 2012年03月22日 20:45:10

很好的dp题。

dp[i][j]表示的是a数组的第i个位置与b数组的第j个位置时最大的交叉匹配数。


/*******************************************************************************
 # Author : Neo Fung
 # Email : neosfung@gmail.com
 # Last modified: 2012-03-22 20:43
 # Filename: ZOJ1425 POJ1692 Crossed Matchings.cpp
 # Description : 
 ******************************************************************************/
#ifdef _MSC_VER
#define DEBUG
#define _CRT_SECURE_NO_DEPRECATE
#endif

#include <fstream>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#include <limits.h>
#include <algorithm>
#include <math.h>
#include <numeric>
#include <functional>
#include <ctype.h>
#define MAX 1010
using namespace std;

int array_a[MAX],array_b[MAX];
int dp[MAX][MAX];

int main(void)
{
#ifdef DEBUG  
  freopen("../stdin.txt","r",stdin);
  freopen("../stdout.txt","w",stdout); 
#endif  

	int ncases,n,m;
	scanf("%d",&ncases);

	while(ncases--)
	{
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;++i)
			scanf("%d",&array_a[i]);
		for(int i=1;i<=m;++i)
			scanf("%d",&array_b[i]);

		memset(dp,0,sizeof(dp));
		
		for(int i=1;i<=n;++i)
			for(int j=1;j<=m;++j)
			{
				dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
				if(array_a[i]==array_b[j])
					continue;

        //找到一个交叉匹配
				int k=i-1,l=j-1;
				for(;k>0;--k)
					if(array_a[k]==array_b[j])
						break;
				for(;l>0;--l)
					if(array_a[i]==array_b[l])
						break;

        //如果找到一个交叉匹配
				if(k>0 && l>0)
					dp[i][j]=max(dp[i][j],dp[k-1][l-1]+1);
			}
		printf("%d\n",dp[n][m]*2);

	}

  return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

POJ1692 Crossed Matchings

POJ1692 Crossed Matchings
  • Kanosword
  • Kanosword
  • 2016年10月30日 16:25
  • 246

POJ1692————Crossed Matchings(动态规划)

There are two rows of positive integer numbers. We can draw one line segment between any two equal n...
  • say_c_box
  • say_c_box
  • 2017年02月26日 14:59
  • 127

POJ1692:Crossed Matchings

Description There are two rows of positive integer numbers. We can draw one line segment between ...
  • libin56842
  • libin56842
  • 2015年05月12日 20:02
  • 1113

ZOJ1425 Crossed Matchings dp

#include #include int n1[101],n2[101]; int d[101][101]; int max(int a,int b) { if(a
  • xuyouqiao2005
  • xuyouqiao2005
  • 2014年07月25日 12:58
  • 248

POJ1692 Crossed Matchings DP

POJ1692 Crossed Matchings DPDescription给出两列数,要求对上下相同的数进行连线,要求 1.一个数最多连一条线。 2.一条线必须且仅与一条线相交。 求最多可以...
  • YJSchaf
  • YJSchaf
  • 2017年05月14日 14:35
  • 241

Crossed Matchings zoj1425 dp

Description There are two rows of positive integer numbers. We can draw one line segment between ...
  • xtulollipop
  • xtulollipop
  • 2015年08月03日 14:10
  • 386

POJ1692 Crossed Matchings(dp)

Crossed Matchings Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2938   Accepted...
  • m0_37846371
  • m0_37846371
  • 2017年07月26日 17:50
  • 67

北大ACM poj1692 Crossed Matchings(动态规划)

Crossed Matchings Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2298 ...
  • gubojun123
  • gubojun123
  • 2012年12月28日 13:05
  • 1401

poj1692 Crossed Matchings(dp,最长公共子序列变形,好题)

Crossed Matchings Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2838 ...
  • fouzhe
  • fouzhe
  • 2017年02月03日 21:09
  • 153

zoj 1425 Crossed Matchings

d[i][j]:=第一行的前i个与第二行的前j个匹配的最大值 d[i][j]:=max(d[i-1][j],d[i][j-1],d[s1-1][s2-1]+2) 1 a[s1]==b[j],a[...
  • Iamallblue
  • Iamallblue
  • 2015年03月11日 17:13
  • 281
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ZOJ1425 POJ1692 Crossed Matchings
举报原因:
原因补充:

(最多只允许输入30个字)