【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 ...
随机推荐
- ASP.NET Core 2.0 集成测试无法执行的问题
问题表现: Microsoft.AspNetCore.Mvc.Razor.Compilation.CompilationFailedException : One or more compilatio ...
- 按键精灵 vbs 获取网页源码 xp系统被拒绝
如下面的代码所示,获取新浪博客某个指定网页的源码 verurl = "http://blog.sina.com.cn/s/blog_9ea1db7b0101o7ch.html?" ...
- Mac上配置不同版本的JDK
Mac上JDK的版本为1.8,编译AOSP时发现需要JDK 1.7.想找一种比较容易切换JDK版本的方式,经过一番Google发现Jenv比较合适. 安装Jenv至少有三种方式: - $ git cl ...
- [转]如何查询SQL Server连接数
1.获取SQL Server允许同时用户连接的最大数 SELECT @@MAX_CONNECTIONS 2.获取当前指定数据库的连接信息 SELECT * FROM master.dbo.syspro ...
- OpenCV探索之路(二十七):皮肤检测技术
好久没写博客了,因为最近都忙着赶项目和打比赛==| 好吧,今天我打算写一篇关于使用opencv做皮肤检测的技术总结.那首先列一些现在主流的皮肤检测的方法都有哪些: RGB color space Yc ...
- http2.4简单配置
前言: 上一篇博文说到了http的发展以及http完整请求响应的工作流程. 一.开篇: 从最简单的静态服务器开始. 之前说过,http是应用层协议,必定会在用户空间体现出具体的应用程序.常见的http ...
- 用JavaScript实现表格编辑器
实现效果: htm l代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- Grafana+Prometheus系统监控之SpringBoot
前言 前一段时间使用SpringBoot创建了一个webhook项目,由于近期项目中也使用了不少SpringBoot相关的项目,趁着周末,配置一下使用prometheus监控微服务Springboot ...
- 数细胞-swust oj
数细胞(0964) 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数.编程需要用到的队列及其相关函数已经实现,你只需要完 ...
- 2943:小白鼠排队-poj
2943:小白鼠排队 总时间限制: 1000ms 内存限制: 65536kB 描述 N只小白鼠(1 < N < 100),每只鼠头上戴着一顶有颜色的帽子.现在称出每只白鼠的重量,要求按 ...