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;elsedp[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;
}
转载于:https://www.cnblogs.com/wolf940509/p/6617129.html
DP专辑之最长公共子序列及其变形相关推荐
- hdu1243 dp (类最长公共子序列)
题意:射击演习中,已知敌人出现的种类顺序,以及自己的子弹种类顺序,当同种类的子弹打到同种类的敌人时会得到相应分数,问最多能得多少分. 这题的题意很好理解,而且模型也很常见,是带权值的类最长公共子序列问 ...
- 最长公共子序列 【DP】+【最长公共子序列】
最长公共子序列 时间限制: 3000 ms | 内存限制: 65535 KB 难度: 3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列. tip ...
- [dp]leetcode1143:最长公共子序列LCS (medium)
题目: 题解: 动态规划的经典例题,可参考晴神的算法笔记 首先先使用暴力法思考吧,设t1和t2的长度分别为m和n,那么对两个字符串中的每个字符,分别只有选和不选两个决策,而得到两个子序列后,比较两个子 ...
- [DP] bzoj2423: [HAOI2010]最长公共子序列
bzoj2423: [HAOI2010]最长公共子序列:https://www.lydsy.com/JudgeOnline/problem.php?id=2423 DP 神啊(DP都是神奇的东西) 第 ...
- 最长公共子序列(C语言)
任务描述 本关任务:编写一个求最长公共子序列的程序. 相关知识 两个序列A[m]=(a1,...,am),B[n]=(b1,b2,...,bn),它的公共子序列是C[k]=(c1,..., ...
- 2192-Zipper 求最长公共子序列的解题报告
主要的思考方向就是求dp里面的最长公共子序列.至于字符串本身的判别并不是重点. 根据网上poj的分类,这个题是dp求最长公共子序列,其实用暴力的方法也能通过.暴力的方法比较简单就不多说了.主要讲讲dp ...
- Human Gene Functions(最长公共子序列变形题)
[题目]:问题 B: Human Gene Functions [来源]:点击打开链接 [解法]:这个题是最长公共子序列的变形题. 1.确定状态:状态表示显然是用二维数组表示DP[i][j]当前i和 ...
- 最长公共子序列长度的四种解法
一.题目:求两个字符序列的最长公共字符子序列.给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence).比如字符串1:BDCABA:字符串2:ABCBDAB, ...
- 动态规划示例汇总-Java版(组合硬币、跳台阶、最小路径和、最长递增子序列、最长公共子序列、01背包问题、最小编辑代价)
动态规划算法示例汇总-Java版 组合硬币 Java解题-暴力搜索 Java解题-记忆搜索 Java解题-动态规划(两种写法) 跳台阶 Java解题-暴力递归 Java解题-动态规划 矩阵最小路径和 ...
最新文章
- 招募 | 《大数据实践课》课程实践企业合作项目
- Linux 运维工程师的六类好习惯
- request对象方法详解
- list修改元素的值_Python 到底是值传递还是引用传递
- Python字典理解
- No changes detected解决方案
- zigbee无线通信数码管实验、usbDongle抓包、发字符串
- linux中为文件赋读写权限
- 总结1-深度学习-基础知识学习
- Redis的数据类型及其常用命令
- 那些让人忍不住推荐的思维导图软件
- Android自动化测试框架Robotium
- axure能做剪切蒙版吗_***自动售货机能做吗
- C语言switch练习之输入某年某月某日,判断这一天是这一年的第几天。
- python 模块相互import
- OCP认证培训学校哪家比较好?您知道怎么选OCP培训机构吗
- 网站提示HTTP503Service Unavailable的处理办法
- 磁共振功能成像BOLD-fMRI原理
- 科学教育类毕业论文文献都有哪些?
- Linux忘记root密码解决方法
热门文章
- java 微信jssdk签名_JAVA生成微信JSSDK接口签名
- 【Node.js】serve 实现目录浏览服务
- android分辨率对应关系,android各dpi与分辨率的对应关系
- mysql 自己写数据库,自己写了一个简单的mysql数据库连接类
- mysql重装远程服务未_CentOS 7系统安装与远程连接MySQL(5.7)
- amd一点也不yes_A粉的狂欢,AMD显卡也翻身了,3A平台不再是笑话了,AMD YES!
- 怎么查看电脑硬盘序列号
- 还在用Matplotlib? 又一可视化神器pyecharts登场
- 中科院信工所经验_2020计算机保研经验贴!(北航、北邮、中科院)
- 学python还是不会编程_你真的不学Python吗?学习Python的四大理由!