【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 ...
随机推荐
- 【WEB API项目实战干货系列】- API访问客户端(WebApiClient适用于MVC/WebForms/WinForm)(四)
这几天没更新主要是因为没有一款合适的后端框架来支持我们的Web API项目Demo, 所以耽误了几天, 目前最新的代码已经通过Sqlite + NHibernate + Autofac满足了我们基本的 ...
- 设计模式的征途—9.组合(Composite)模式
树形结构在软件中随处可见,比如操作系统中的目录结构,公司组织结构等等,如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题.组合模式通过一种巧妙的设计方案来使得用户可以一致性地处理整个树形 ...
- 如何创建 Swarm 集群?- 每天5分钟玩转 Docker 容器技术(95)
本节我们将创建三节点的 swarm 集群. swarm-manager 是 manager node,swarm-worker1 和 swarm-worker2 是 worker node. 所有节点 ...
- springMVC初探
MVC框架要做哪些事情? a,将url映射到java类,或者java类的方法上 b,封装用户提交的数据 c,处理请求->调用相关的业务处理—>封装响应的数据 d,将响应的数据进行渲染 sp ...
- STM32基础问题分析——PWM配置
STM32基础问题分析--PWM配置 在使用STM32F103产生固定频率.固定占空比的PWM波时,虽然有官方以及众多开发板提供的例程,但是关于有点问题并没有说的很清晰,并且<STM32F10X ...
- Verilog中变量位宽注意
Verilog中,变量定义方式可以为:reg[位宽-1:0] 数据名:reg[位宽:1] 数据名.其他变量也类似. 以reg变量cnt为例,当cnt位宽为4时,可定义为reg[3:0] cnt,或者定 ...
- TQ2440在Ubuntu16.04上如何搭建DNW烧写环境
八月份国赛比完,原计划开始的嵌入式Linux学习一直拖到了现在:由于之前所有的开发全在Windows下进行的,对各种底层完全不清楚,刚好这段时间开始学习Linux,我就在想能不能把开发环境给迁移到Li ...
- Mybatis3 快速入门
Mybatis3 快速入门 目前常见的持久层java框架有Hibernate,Mybatis,SpringData.笔者比较喜欢用SpringData.Hibernate 和 Mybatis 也经常用 ...
- Java面向对象回顾(1)
世界万物皆对象. 面向对象四大特性:继承.封装.多态.抽象 Java中现有类,再有对象.创建对象(对象实例化)必须先创建类. 将对象的特征对应写成类的属性. 将对象的方法对应携程类的方法. 如何创建对 ...
- Python学习笔记整理总结【web基础】【web/HTML/CSS/JavaScript/DOM/jQuery】
一.HTML HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以 ...