poj1458 求最长公共子序列 经典DP
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 45763 | Accepted: 18737 |
Description
Input
Output
Sample Input
abcfbc abfcab
programming contest
abcd mnp
Sample Output
4
2
0
题目大意:给你两个字符串,求两个字符串最长公共子串的长度,结合题意应该很容易理解题意。
思路分析:啥也不说,经典DP,首先确定状态以及状态的储存方法,用一个二维数组f[n][n]来进行储存,f[i][j]表示第一个字符串的前i位与后一个字符串的前j位最长公共
子序列长度,然后需要思考状态如何进行转移,若s1[i]==s2[j],f[i][j]=f[i-1][j-1]+1;若s1[i]!=s2[j],则f[i][j]应该与f[i][j-1]或者f[i-1][j]一致,具体
看那一个大,即f[i][j]=max{f[i][j-1],f[i-1][j]},这样状态转移方程也确定了。在代码实现的时候需要注意几点,首先字符串长度并没有给你,开到210就可以了,另外
初始状态要合理进行处理,否则会出现数组越界的错误!
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack>
#include <cmath>
using namespace std;
const int maxn=210;
char s1[maxn],s2[maxn];
int dp[maxn][maxn];
int main()
{
int i,j;
while(scanf("%s%s",s1,s2)!=EOF)
{
int l1=strlen(s1);
int l2=strlen(s2);
for(i=0;i<l1;i++)
{
for(j=0;j<l2;j++)
{
if(s1[i]==s2[j])
{
if(i>=1&&j>=1) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=1;
}
else
{
if(i>=1&&j>=1) dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
else if(j>=1) dp[i][j]=dp[i][j-1];
else if(i>=1) dp[i][j]=dp[i-1][j];
else dp[i][j]=0;
}
}
}
int t=dp[0][0];
for(i=0;i<l1;i++)
for(j=0;j<l2;j++)
if(t<dp[i][j]) t=dp[i][j];
cout<<t<<endl;
}
return 0;
}
poj1458 求最长公共子序列 经典DP的更多相关文章
- HDU 4681 string 求最长公共子序列的简单DP+暴力枚举
先预处理,用求最长公共子序列的DP顺着处理一遍,再逆着处理一遍. 再预处理串a和b中包含串c的子序列,当然,为了使这子序列尽可能短,会以c 串的第一个字符开始 ,c 串的最后一个字符结束 将这些起始位 ...
- Java实现 LeetCode 583 两个字符串的删除操作(求最长公共子序列问题)
583. 两个字符串的删除操作 给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符. 示例: 输入: " ...
- [algorithm]求最长公共子序列问题
最直白方法:时间复杂度是O(n3), 空间复杂度是常数 reference:http://blog.csdn.net/monkeyandy/article/details/7957263 /** ** ...
- HDU 1243 反恐训练营 (动态规划求最长公共子序列)
反恐训练营 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- 【dp】求最长公共子序列
[题目描述] 一个给定序列的子序列是在该序列中删去若干元素后得到的序列.确切地说,若给定序列X=<x1,x2,…,xm>X=<x1,x2,…,xm>,则另一序列Z=<z1 ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- P1439 【模板】最长公共子序列(DP)
题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...
- POJ-1458(LCS:最长公共子序列模板题)
Common Subsequence POJ-1458 //最长公共子序列问题 #include<iostream> #include<algorithm> #include& ...
- 洛谷 P1439 【模板】最长公共子序列(DP,LIS?)
题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...
随机推荐
- PHP MAIL DEMO(程序代码直接发送邮件)
php代码 <?php // 收件人邮箱地址 $to = 'xxxxxx@qq.com'; // 邮件主题 $title = '测试邮件发送'; // 邮件内容 $msg = '这是一封测试邮件 ...
- 分布式Session共享(二):tomcat+memcached实现session共享
一.前言 本文主要测试memcached实现session共享的实现方式,不讨论如何让nginx参与实现负载均衡等. 二.环境配置 本测试在Window下进行 name version port To ...
- 【6】Laravel5.1的migration数据库迁移
查看Laravel5.1的目录 当你配置好数据库后,在命令行执行下边的操作 php artisan migrate 打开数据库会发现,我们的数据库多了四个表,神奇吧! 打开任意一个migration查 ...
- Tree 使用方式
Traditional Ways of Tree Traversal This page contains examples of some “standard” traversal algorith ...
- Oracle11g R2学习系列 之五回闪
Oracle里面有一个回闪的操作,这个貌似sql server是没有的.要使用这个功能,需要用到两个时间内部函数 TIMESTAMP和TO_TIMESTAMP.其中,函数TO_TIMESTAMP的语法 ...
- javascript区分电脑与手机登陆
<script language="javascript"> function checkMobile() { var pda_user_agent_list = ne ...
- 鼠标悬停移除更换class
$("#xinl").mouseover(function() //鼠标悬停执行函数 { $(".xl").removeClass().addClass(&q ...
- js判断输入的是单字节还是双字节
计算机上每一个字符.数字.汉字.字母等,都对应着unicode编码,unicode编码小于255的为单字节,大于255.小于65535的为双子节或三字节 查看一个字符对应的unicode编码 var ...
- (转)CentOS搭建Nagios监控
A.Nagios服务端1.安装软件包 yum install -y httpd 2.下载nagios wget http://syslab.comsenz.com/downloads/linux/na ...
- 《Programming WPF》翻译 第9章 5.默认可视化
原文:<Programming WPF>翻译 第9章 5.默认可视化 虽然为控件提供一个自定义外观的能力是有用的,开发者应该能够使用一个控件而不用必须提供自定义可视化.这个控件应该正好工作 ...