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;
}


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

ZOJ1425 Crossed Matchings dp

#include #include int n1[101],n2[101]; int d[101][101]; int max(int a,int b) { if(a

poj 1692 Crossed Matchings

题目链接:http://poj.org/problem?id=1692 题目思路:转移方程:dp[i][j]=max(dp[i-1][j],dp[i][j-1],dp[up[i][j]-1][dow...

POJ 1692 Crossed Matchings (DP) #by Plato

http://poj.org/problem?id=1692 题意:两个集合分别有N1、N2个元素,求最大匹配交叉对的数目。(匹配交叉对:a和b中有两个元素相等,称其为value-match;现在是...

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

Crossed Matchings Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2298 ...

POJ1692:Crossed Matchings

Description There are two rows of positive integer numbers. We can draw one line segment between ...

poj 1692 Crossed Matchings DP

点击打开题目链接 题意:给

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

There are two rows of positive integer numbers. We can draw one line segment between any two equal n...

POJ 1692 Crossed Matchings

dp

POJ 1692 Crossed Matchings(DP)

题意 有两行数a[n1] b[n2] 分别有n1 n2个数 当第一行一个数和第二行一个数相等时 他们就可以连起来 每个数只能连一个 求最有多少条线使得每条都至少有一条和它相交 令...

ZOJ 1425 Crossed Matchings DP LCS

ZOJ 1425 Crossed Matchings题目描述:  题目链接:ZOJ 1425 Crossed Matchings题目大意:  上下2组数据,找一个满足条件的最大匹配数。匹配条...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ZOJ1425 POJ1692 Crossed Matchings
举报原因:
原因补充:

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