【cogs 597】【dp】交错匹配
597. 交错匹配
★☆ 输入文件:crossa.in 输出文件:crossa.out 简单对照
时间限制:1 s 内存限制:128 MB
【问题描写叙述】
有两行自然数。 UP[1..N] 。 DOWN[1..M] 。假设UP[I]=DOWN[J]=K 。那么上行的第 I 个位置的数就能够跟下行的第 J 个位置的数连一条线,称为一条 K 匹配,可是 同一个位置 的数最多仅仅能连一条线。另外,每个 K 匹配都 必须且至多 跟一个 L 匹配相交且 K ≠ L !
如今要求一个最大的匹配数。
【输入格式】
第一行有两个正整数 N 和 M 。
第二行 N 个 UP 的自然数。第三行 M 个 DOWN 的自然数。
当中
0<N。M<=200, UP、DOWN 的数都不超过 32767 。
【输出格式】
最大匹配数 。
【输入输出例子1】
输入:
crossa.in
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
输出:
crossa.out
8
【输入输出例子2】
输入:
crossa.in
4 4
1 1 3 3
1 1 3 3
输出:
crossa.out
0
题解:
题意略坑。分析例子能够发现事实上是要求 满足每条上下连边(i到j连边条件是a[i]==b[j])都有且仅仅有还有一条连边与之相交 的最多边数。
于是能够dp。f[i][j]表示在a[i],b[j]前满足条件的最大边数。
考虑转移,首先每个状态f[i][j]都是有上两个状态转移来,即
f[i][j]=max(f[i-1][j],f[i][j-1])
然后当前状态是能够由一个新连边状态来尝试更新的,即
f[i][j]=max(f[i][j],f[x-1][y-1]+2)(x,y是新连边状态的位置)
Code:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m,ans=0,a[310]={0},b[310]={0},f[310][310];
int in(){
int x=0; char ch=getchar();
while (ch<'0' || ch>'9') ch=getchar();
while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return x;
}
int last(int c[],int w,int k){
for (int i=w-1; i>=1; i--)
if (c[i]==k) return i;
return 0;
}
void dp(){
f[0][0]=f[0][1]=f[1][0]=0;
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++){
int x,y;
f[i][j]=max(f[i-1][j],f[i][j-1]);
if (a[i]==b[j]) continue;
x=last(a,i,b[j]);
y=last(b,j,a[i]);
if (x>0 && y>0)
f[i][j]=max(f[i][j],f[x-1][y-1]+2);
}
ans=f[n][m];
}
int main(){
n=in(),m=in();
for (int i=1; i<=n; i++) a[i]=in();
for (int i=1; i<=m; i++) b[i]=in();
dp();
printf("%d\n",ans);
return 0;
}
【cogs 597】【dp】交错匹配的更多相关文章
- poj 2955 Brackets (区间dp 括号匹配)
Description We give the following inductive definition of a “regular brackets” sequence: the empty s ...
- Codeforces 5C Longest Regular Bracket Sequence(DP+括号匹配)
题目链接:http://codeforces.com/problemset/problem/5/C 题目大意:给出一串字符串只有'('和')',求出符合括号匹配规则的最大字串长度及该长度的字串出现的次 ...
- 区间dp括号匹配
POJ2955 匹配则加一,不需要初始化 //#include<bits/stdc++.h> #include<iostream> #include<cstdio> ...
- 区间dp 括号匹配问题
这道题目能用区间dp来解决,是因为一个大区间的括号匹配数是可以由小区间最优化选取得到(也就是满足最优子结构) 然后构造dp 既然是区间类型的dp 一般用二维 我们定义dp[i][j] 表示i~j这个区 ...
- 区间dp - 括号匹配并输出方案
Let us define a regular brackets sequence in the following way: 1. Empty sequence is a regular seque ...
- [POJ2404]Jogging Trails(中国旅行商问题)(一般图的匹配——状压DP)
题目:http://poj.org/problem?id=2404 题意:有个n(n<=15)的点和m条无向边,每条边都有自己的权值.现在你要从某个点出发,每条边可以经过多次但要保证每条边至少走 ...
- bzoj 2806: [Ctsc2012]Cheat 后缀自动机DP
2806: [Ctsc2012]Cheat Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 583 Solved: 330[Submit][Statu ...
- poj3267--The Cow Lexicon(dp:字符串组合)
The Cow Lexicon Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8211 Accepted: 3864 D ...
- 区间DP(区间最优解)题目讲解总结
1:给出一个括号字符串,问这个字符串中符合规则的最长子串的长度. [分析]区间DP要覆盖整个区间,那么要求所有情况的并集. 先想出状态方程: dp[i][j]:i ~ j区间内最大匹配数目 输出:dp ...
随机推荐
- jquery操作html小技巧
1.隐藏table整列 $("#tableID tr").find('td:eq(N)').hide();
- 分页查询时,使用cookie保存上次的查询条件。jQuery实现方法以及中间遇到的坑
今天做分页查询时需要在跳转页面时保存上次查询的条件,如下: 实现的大致思路就是用cookie本地保存. 其中需要用到jQuery.Cookie插件. 使用方法很简单: 存数据:$.cookie(“ke ...
- JAVA面试之集合框架(三)
21.ArrayList和Vector的区别 这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态 ...
- P3092 [USACO13NOV]没有找零No Change
题目描述 Farmer John is at the market to purchase supplies for his farm. He has in his pocket K coins (1 ...
- AIO5系统中关于赠品处理的方法
最近频繁有人问我,关于赠品在AIO5系统中如何处理.首先AIO5系统支持赠品处理关于赠品,在AIO5系统中走的是[其他出库单]路径:仓库--仓库作业--其他出库单--新增(如下图) 通常赠品对应的业务 ...
- Linux下执行ls命令提示CMake Error错误
一.系统环境 Fedora10 二.出错情况 执行ls命令出现如下错误提示: CMake Error: The source directory "/etc/--color=auto&quo ...
- TFboy养成记 简单小程序(Variable & placeholder)
学习参考周莫烦的视频. Variable:主要是用于训练变量之类的.比如我们经常使用的网络权重,偏置. 值得注意的是Variable在声明是必须赋予初始值.在训练过程中该值很可能会进行不断的加减操作变 ...
- 二叉树、栈、队列、链表的Java代码实现
这是我的学习总结. 如有文章存在谬误,欢迎指出,有其他意见或者建议,也欢迎留言 二叉树链表 前序遍历:先访问根节点,然后访问左子树.右子树 中序遍历:先访问左子树,然后访问根节点.右子树 后序遍历:先 ...
- 个人笔记之json实现模糊查询
1:首先创建一个项目如:(说明:此项目是在eclipse创建的) 2.在创建相对应的包如: 3.创建写好相对应的配置文件如: applicationContext.xml具体内容如下: <?xm ...
- C语言之循环计数
#include<stdio.h>int main(){int num,count=0,i=0;scanf("%d",&num);num/=10;count++ ...