zoj 1425 最大交叉匹配

Crossed Matchings


Time Limit: 2 Seconds      Memory Limit: 65536 KB


There are two rows of positive integer numbers. We can draw one line segment between any two equal numbers, with values r, if one of them is located in the first row and the other one is located in the second row. We call this line segment an r-matching segment. The following figure shows a 3-matching and a 2-matching segment.

We want to find the maximum number of matching segments possible to draw for the given input, such that:

1. Each a-matching segment should cross
exactly one b-matching segment, where a != b.

2. No two matching segments
can be drawn from a number. For example, the following matchings are not
allowed.

Write a program to compute the maximum number of matching segments for the
input data. Note that this number is always even.

Input

The first line of the file is the number M, which is
the number of test cases (1 <= M <= 10). Each test case has three lines.
The first line contains N1 and N2, the number of integers on the first and the
second row respectively. The next line contains N1 integers which are the
numbers on the first row. The third line contains N2 integers which are the
numbers on the second row. All numbers are positive integers less than 100.

Output

Output file should have one separate line for each
test case. The maximum number of matching segments for each test case should be
written in one separate line.

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

 1 /*
 2 zoj 1425 最大交叉匹配
 3 题目大意:给两行序列,求他们的最大交叉数*2。
 4 定义交叉:上下相同的数字连线,两条这样的线相交,
 5 每个数字只能用与一条线,且两条线的数字不等。
 6 定义dp(i,j)表示第一行至i,第二行至j,的最大交叉数,
 7 dp(i,j)=max(dp(i-1,j-1)((i,j都不是))dp(i-1,j)(i不是),dp(i,j-1)(j不是),dp(n-1,m-1)+1(n-j,m-i交叉))。
 8 */
 9 #include <iostream>
10 #include <cstdio>
11 #include <cstring>
12 using namespace std;
13
14 const int maxn=105;
15 int dp[maxn][maxn];
16 int a[maxn],b[maxn];
17
18 inline int max(int a,int b){return a>b?a:b;}
19
20 int main()
21 {
22     int t,i,j,k,l,n,m;
23     scanf("%d",&t);
24     while(t--)
25     {
26         scanf("%d%d",&n,&m);
27         for(i=1;i<=n;i++) scanf("%d",a+i);
28         for(i=1;i<=m;i++) scanf("%d",b+i);
29         memset(dp,0,sizeof(dp));
30         for(i=1;i<=n;i++)
31         {
32             for(j=1;j<=m;j++)
33             {
34                 dp[i][j]=max(dp[i-1][j-1],max(dp[i-1][j],dp[i][j-1]));
35                 if(a[i]==b[j]) continue;//两条交叉线段必须数字不同
36                 k=i-1;l=j-1;
37                 while(k>0 && a[k]!=b[j]) k--;
38                 while(l>0 && a[i]!=b[l]) l--;
39                 if(k && l) dp[i][j]=max(dp[k-1][l-1]+1,dp[i][j]);
40             }
41         }
42         printf("%d\n",dp[n][m]*2);
43     }
44     return 0;
45 }
时间: 2024-10-25 03:30:25

zoj 1425 最大交叉匹配的相关文章

ZOJ 1425 Crossed Matchings(动态规划)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1425 Crossed Matchings Time Limit: 2 Seconds      Memory Limit: 65536 KB There are two rows of positive integer numbers. We can draw one line segment between any two equal numbers, with val

ZOJ 1425 Crossed Matchings(LCS变形)

题目大意: 就是说给你两行数字,然后对于每一行的相同的数字进行连线,每次连接成功后,就算是1次成功,求最大的成功次数.当然,要成功的话,也是要满足一定的条件的: 1.在连接的过程中,不能用两根线连接了4个相同数字. 2.一个数字不能发出两条线. 解题思路: 刚看到这个题,以为是图论的知识,感觉自己拿不下,,(有点像是什么二分图匹配吧,用两个颜色给相邻的顶点染色,求最多能有多少种这样的匹配,,逃) 其实呢,这个有点像LCS,,,我第一次也没看出来,看了题解后,才明白的. 我们规定这样的状态: dp

zoj 3460 二分+二分图匹配

不错的思想 1 /* 2 大致题意: 3 4 用n个导弹发射塔攻击m个目标.每个发射架在某个时刻只能为 5 一颗导弹服务,发射一颗导弹需要准备t1的时间,一颗导弹从发 6 射到击中目标的时间与目标到发射架的距离有关.每颗导弹发 7 射完成之后发射架需要t2的时间进入下个发射流程.现在问 8 最少需要多少时间可以击毁所有m个目标. 9 10 11 大致思路: 12 二分枚举这个最大时间的最小值,每次按照这个枚举的时间构出 13 二分图,求最大匹配来判定枚举值是否符合要求. 14 15 注意单位,T

特征匹配算法之误匹配的剔除

特征匹配 特征匹配是计算机视觉中经常要用到的一步.通过对图像与图像或者图像与地图之间的描述子进行准确匹配,我们可以为后续的姿态估计,优化等操作减轻大量负担.然而,由于图像特征的局部特性,误匹配的情况广泛存在.在opencv的匹配算法中 实际上集成了一些对误匹配的处理.我们首先介绍一下暴力匹配算法. 暴力匹配 cv::BFMatcher        暴力匹配是指依次查找(穷举搜索)第一组中每个描述符与第二组中哪个描述符最接近.当然初始的暴力匹配得到的误匹配很多.我们可以通过交叉匹配过滤的方法对误

洛谷P2777 [AHOI2016初中组]自行车比赛

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! 题目链接:洛谷P2777 正解:贪心 解题报告: 考虑每次的匹配情况,很容易发现,每次都是当前的取最大值,然后其余的交叉匹配,维护一个区间$max$就好了,每次移动. #include <iostream> #include <cstdio>

Shader预处理宏、内置状态变量、多版本编译等

预定义shader预处理宏: Target platform: SHADER_API_OPENGL - desktop OpenGL SHADER_API_D3D9 - Direct3D 9 SHADER_API_XBOX360 - Xbox 360 SHADER_API_PS3 - PlayStation 3 SHADER_API_D3D11 - desktop Direct3D 11 SHADER_API_GLES - OpenGL ES 2.0 (desktop or mobile), u

2014 Super Training #2 F The Bridges of Kolsberg --DP

原题:UVA 1172  http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3613 动态规划问题. 定义: dp[i] = 右岸前i个村庄(m岸)能够与左岸(n岸)不交叉匹配的最大权值和最小桥数 (用pair<int,int> 维护两个值) 方程: dp[i].first = max(dp[i].first,dp[i-1].fir

从良品铺子看传统零售自救 商业模式之外 O2O更该是思维方式

很长一段时间以来,O2O都被传统零售业当做治愈线下零售阵痛的灵丹妙药,有太多的零售商趋之若鹜的高举O2O大旗,结果搞来搞去也没弄清楚究竟该如何O2O.这其中问题主要出在对O2O的理解上,很多企业五迷三道的信奉O2O模式,而实际上O2O更应该是一种思维方式. 商业模式之外 O2O更该是思维方式 不妨先想下你对O2O模式的认知或是对其做个定义,线上线下融合?这恐怕不叫模式吧,最多算是O2O概念的释义.回想一下,如今所谓的O2O模式,没有上百也有几十,零售O2O.餐饮O2O.家政O2O.社区O2O.汽

笔记之_Java数据库整理

sqlserver复制表结构:并删除数据: select T.* into TABLE_ORDER_CANCEL from TABLE_ORDER T TRUNCATE TABLE TABLE_ORDER_CANCEL Count(*)后不能排序 数据库的四个特性: 原子性.一致性.隔离性.持久性 事务隔离级别: 脏读 不可重复读 幻读 Read uncommitted √ √ √ Read committed × √ √ Repeatable read × × √ Serializable ×