ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

#P2030. 交错匹配

2022-07-11 11:33:11  阅读:161  来源: 互联网

标签:匹配 P2030 自然数 UP DOWN 交错 include


#P2030. 交错匹配

题目描述

有两行自然数,UP[1..N],DOWN[1..M],如果UP[I]=DOWN[J]=K,那么上行的第I个位置的数就可以跟下行的第J个位置的数连一条线,称为一条K匹配,但是同一个位置的数最多只能连一条线。另外,每个K匹配都必须且至多跟一个L匹配相交且K≠L!现在要求一个最大的匹配数。 例如:以下两行数的最大匹配数为8

输入格式

第一行有两个正整数N和M。

第二行N个UP的自然数,第三行M个DOWN的自然数。其中0<N、M<=200,UP、DOWN的数都不超过32767。

输出格式

最大匹配数输出

样例

输入数据 1

1 2 3 3 2 4 1 5 1 3 5 10
3 1 2 3 2 4 12 1 5 5 3

输出数据 1

8

输入数据 2

1 1 3 3
1 1 3 3

输出数据 2

0

Solution

首先注意到,题目给定的数据规模不大,只有 \(200\) ,因此可以考虑用稍微暴力一点的算法。

提前预处理出与 \(down_i\) 相同的 \(up_i\) 的位置,存储在 \(same_i\) 中,然后 \(\text{DP}\) 。

设 \(f[i][j]\) 表示 \(up\) 前 \(i\) 个和 \(down\) 前 \(j\) 个能够构成的交错匹配数量。那么可以直接枚举交错匹配四个端点的位置,并尝试更新答案。

对于每个新的 \(f[i][j]\) ,答案可以从 \(f[i][j-1]\) 和 \(f[i-1][j]\) 继承过来。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<limits.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof(a));
using namespace std;
template<typename T> void read(T &k)
{
 	k=0;
	T flag=1;char b=getchar();
	while (b<'0' || b>'9') {flag=(b=='-')?-1:1;b=getchar();}
	while (b>='0' && b<='9') {k=(k<<3)+(k<<1)+(b^48);b=getchar();}
	k*=flag;
}
const int _SIZE=2e2;
int n,m;
int up[_SIZE+5],down[_SIZE+5];
int same[_SIZE+5][_SIZE+5],f[_SIZE+5][_SIZE+5];
int main()
{
	read(n);read(m);
	for (int i=1;i<=n;i++) read(up[i]);
	for (int i=1;i<=m;i++) read(down[i]);
	for (int i=1;i<=n;i++)
		for (int j=1;j<=m;j++)
			if (up[i]==down[j]) same[j][++same[j][0]]=i;
	for (int i=1;i<=n;i++)
		for (int j=1;j<=m;j++)
		{
			f[i][j]=max(f[i-1][j],max(f[i][j-1],f[i][j]));
			if (up[i]!=down[j]) continue;
			for (int k=j+1;k<=m;k++)
				if (down[k]==down[j]) continue;
				else for (int l=1;l<=same[k][0];l++)
					if (same[k][l]>=i) break;
					else f[i][k]=max(f[i][k],f[same[k][l]-1][j-1]+2);
		}
	printf("%d\n",f[n][m]);
	return 0;
}

标签:匹配,P2030,自然数,UP,DOWN,交错,include
来源: https://www.cnblogs.com/hanx16msgr/p/16465825.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有