DP专辑之最长公共子序列及其变形
vijos1111(裸的最长公共子序列)
链接:www.vijos.org/p/1111
题解:好久没有写最长公共子序列了,这题就当是复习了。求出最长公共子序列,然后用两个单词的总长度减去最长公共子序列
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=101;
int dp[maxn][maxn];
char a[maxn],b[maxn];
int main()
{
while(cin>>a>>b)
{
int n=strlen(a);
int m=strlen(b);
for(int i=0;i<n;i++) //最长公共子序列模板
for(int j=0;j<m;j++)
{
if(a[i]==b[j])
dp[i+1][j+1]=dp[i][j]+1;
else
dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);
}
cout<<n+m-dp[n][m]<<endl;
}
return 0;
}
vijos1680(最长公共子序列的变形)
链接:www.vijos.org/p/1680
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=2001;
int dp[maxn][maxn];
char a[maxn],b[maxn];
int minx(int x,int y,int z)
{
int ab=x;
if(y<ab) ab=y;
if(z<ab) ab=z;
return ab;
}
int main()
{
int k;
while(cin>>a>>b>>k)
{
int n=strlen(a);
int m=strlen(b);
for(int i=0;i<n;i++)
dp[i+1][0]=dp[i][0]+k;
for(int i=0;i<m;i++)
dp[0][i+1]=dp[0][i]+k;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
dp[i+1][j+1]=minx(dp[i][j+1]+k,dp[i+1][j]+k,dp[i][j]+abs(a[i]-b[j]));
cout<<dp[n][m]<<endl;
}
return 0;
}
vijos 1264(最长公共上升序列)
链接:www.vijos.org/p/1264
题解:用dp[i,j]表示a序列的前i个为结尾和以b序列的第j个为结尾的最长上升公共序列长度。则:
dp[i,j]=max{dp[i-1,k]}+1 | (a[i]=b[j]) and (b[k]<b[j])
dp[i,j]=dp[i-1,j] | (a[i]<>b[j])
程序里面在j循环顺带着就找到了最小的k。对于所有小于a[i]的b[k],必定在a[i]=b[j]时小于b[j],所以满足了约束条件。
最后再把i那维给降调。(为什么没有滚动,因为b[k]<>a[i],所dp[k]必定没有没修改)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=501;
int dp[maxn];
int a[maxn],b[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
cin>>m;
for(int i=1;i<=m;i++)
scanf("%d",&b[i]);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++) //最长上升公共序列
{
int mx=0;
for(int j=1;j<=m;j++)
{
if(a[i]>b[j])
mx=max(mx,dp[j]);
else if(a[i]==b[j])
dp[j]=max(mx+1,dp[j]);
}
}
int mx=0;
for(int i=1;i<=m;i++)
if(mx<dp[i])
mx=dp[i];
cout<<mx<<endl;
}
return 0;
}
DP专辑之最长公共子序列及其变形的更多相关文章
- hdu5282 最长公共子序列的变形
pid=5282">http://acm.hdu.edu.cn/showproblem.php?pid=5282 Problem Description Xuejiejie loves ...
- HDU 1159 Common Subsequence --- DP入门之最长公共子序列
题目链接 基础的最长公共子序列 #include <bits/stdc++.h> using namespace std; ; char c[maxn],d[maxn]; int dp[m ...
- hdu1243 dp (类最长公共子序列)
题意:射击演习中,已知敌人出现的种类顺序,以及自己的子弹种类顺序,当同种类的子弹打到同种类的敌人时会得到相应分数,问最多能得多少分. 这题的题意很好理解,而且模型也很常见,是带权值的类最长公共子序列问 ...
- hdu1080 DP(类最长公共子序列)
题意,有两个字符串,分别由四个字母构成,字母之间有不同的相似度,允许在两个字符串都按原顺序排列的情况下进行字母与字母之间的匹配,也可以让字母与空格匹配,即相当于在字符串中间加空格来一一匹配,每个字母与 ...
- POJ 1458 Common Subsequence (DP+LCS,最长公共子序列)
题意:给定两个字符串,让你找出它们之间最长公共子序列(LCS)的长度. 析:很明显是个DP,就是LCS,一点都没变.设两个序列分别为,A1,A2,...和B1,B2..,d(i, j)表示两个字符串L ...
- 【dp】求最长公共子序列
[题目描述] 一个给定序列的子序列是在该序列中删去若干元素后得到的序列.确切地说,若给定序列X=<x1,x2,…,xm>X=<x1,x2,…,xm>,则另一序列Z=<z1 ...
- DP动态规划———LCS最长公共子序列
递推公式: ]==b[j-]) { dp[i][j]=dp[i-][j-]+; } else { dp[i][j]=max(dp[i-][j],dp[i][j-]); } 完整模板代码: int LC ...
- HDU 1080 Human Gene Functions - 最长公共子序列(变形)
传送门 题目大意: 将两个字符串对齐(只包含ACGT,可以用'-'占位),按照对齐分数表(参见题目)来计算最后的分数之和,输出最大的和. 例如:AGTGATG 和 GTTAG ,对齐后就是(为了表达对 ...
- hdu 1080 dp(最长公共子序列变形)
题意: 输入俩个字符串,怎样变换使其所有字符对和最大.(字符只有'A','C','G','T','-') 其中每对字符对应的值如下: 怎样配使和最大呢. 比如: A G T G A T G - G ...
随机推荐
- python3.x之print()
1.print内容 #!/usr/bin/python print('hello world') //print("hello world") 2.print变量 #!/us ...
- Leetcode 数组问题:删除排序数组内的重复项
问题描述: 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...
- qq空间微博等更多社交平台分享
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- java.nio.ByteBuffer 以及flip,clear及rewind区别
Buffer 类 定义了一个可以线性存放primitive type数据的容器接口.Buffer主要包含了与类型(byte, char…)无关的功能. 值得注意的是Buffer及其子类都不是线程安全的 ...
- Linux C函数库大全
(1)字符测试函数 isalnum(测试字符是否为英文字母或数字) isalpha(测试字符是否为英文字母) isascii(测试字符是否为ASCII码字符) isblank(测试字符是否为空格字符) ...
- fatal error C1189: #error : core.hpp header must be compiled as C++
两次opencv工程需要设置为C++编译:找了一半天的解决方法. I am building a C application that uses OpenCV. when compiling, I g ...
- 关于Java基础的一些笔试题总结
针对近期腾讯.京东.网易等公司的笔试,遇到一些有关Java基础的问题,在此总结,希望能通过这几道经典问题题发散,举一反三,借此打牢基础!自己总结,望提出宝贵意见! 一.关于null的一道小题 先开开 ...
- 全志a13开发总结
这几天因为工作的原因,開始接触全志a13芯片,本人在网上搜集了好长时间,可是网上的资料对这方面的描写叙述是很少的, 所以,仅仅能靠数据手冊还有官网上面的英文文档进行开发了,下面仅仅是开发中的非常少的一 ...
- PS 如何使用液化工具给人物减肥
进入"液化", 有个收缩按钮, 可以选择范围大小, 想瘦哪里, 瘦多少都OK 最终效果图 1.打开原图,进入通道面板,选择菜单图像计算,计算红色通道,保留人物见图. ...
- 怎么下载google商店的扩展程序?
首先,你有机会进入到了外网! 浏览器输入:chrome://extensions 复制唯一的ID进入:http://crx.2333.me/ ,然后下载即可!