最长公共子序列可以用在下面的问题时:给你一个字符串,请问最少还需要添加多少个字符就可以让它编程一个回文串?

解法:ans=strlen(原串)-LCS(原串,反串);

Sample Input

abcfbc         abfcab
programming contest
abcd mnp

Sample Output

4
2
0 代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <iostream>
#include <string>
#include <algorithm> using namespace std; char s[10100], t[10100];
int dp[10100][10100];
//dp[i+1][j+1]:表示序列s的前i个和序列t的前j个的最长公共子序列
//因为字符串从0下标开始存储的 dp[][]数组的0行 0列都被初始化为0
//比如说s[0]=t[0] 就会推出dp[0+1][0+1]=dp[0][0]+1=1
//dp[1][1]=1 也就是s的前1个和t的前1个序列中最长序列为1 int LCS()
{
int i, j;
int len1=strlen(s); int len2=strlen(t); for(i=0; i<len1; i++) dp[i][0]=0;
for(i=0; i<len2; i++) dp[0][i]=0; for(i=0; i<len1; i++){
for(j=0; j<len2; j++){
if(s[i]==t[j]) dp[i+1][j+1]=dp[i][j]+1; else
dp[i+1][j+1]=max(dp[i+1][j], dp[i][j+1]);
}
}
return dp[len1][len2];
} int main()
{
while(scanf("%s", s)!=EOF){
scanf("%s", t);
int ans=LCS();
printf("%d\n", ans );
}
return 0;
}

现在我修改了字符串开始存储的位置,这样:scanf("%s", s+1); 从下标1开始存储,注意 正确的 len=strlen(s+1);

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <iostream>
#include <string>
#include <algorithm> using namespace std; char s[10100], t[10100];
int dp[10100][10100];
//dp[i+1][j+1]:表示序列s的前i个和序列t的前j个的最长公共子序列
//因为字符串从0下标开始存储的 dp[][]数组的0行 0列都被初始化为0
//比如说s[0]=t[0] 就会推出dp[0+1][0+1]=dp[0][0]+1=1
//dp[1][1]=1 也就是s的前1个和t的前1个序列中最长序列为1 int LCS()
{
int i, j;
int len1=strlen(s+1); int len2=strlen(t+1); for(i=0; i<=len1; i++) dp[i][0]=0;
for(i=0; i<=len2; i++) dp[0][i]=0; for(i=1; i<=len1; i++){
for(j=1; j<=len2; j++){
if(s[i]==t[j]) dp[i][j]=dp[i-1][j-1]+1; else
dp[i][j]=max(dp[i-1][j], dp[i][j-1]);
}
}
return dp[len1][len2];
} int main()
{
while(scanf("%s", s+1)!=EOF){
scanf("%s", t+1);
int ans=LCS();
printf("%d\n", ans );
}
return 0;
}

【简单dp】poj 1458 最长公共子序列【O(n^2)】【模板】的更多相关文章

  1. POJ 1458 最长公共子序列(dp)

    POJ 1458 最长公共子序列 题目大意:给出两个字符串,求出这样的一 个最长的公共子序列的长度:子序列 中的每个字符都能在两个原串中找到, 而且每个字符的先后顺序和原串中的 先后顺序一致. Sam ...

  2. POJ 1458 最长公共子序列

    子序列就是子序列中的元素是母序列的子集,且子序列中元素的相对顺序和母序列相同. 题目要求便是寻找两个字符串的最长公共子序列. dp[i][j]表示字符串s1左i个字符和s2左j个字符的公共子序列的最大 ...

  3. POJ 1458 最长公共子序列 LCS

    经典的最长公共子序列问题. 状态转移方程为 : if(x[i] == Y[j]) dp[i, j] = dp[i - 1, j - 1] +1 else dp[i, j] = max(dp[i - 1 ...

  4. Common Subsequence POJ - 1458 最长公共子序列 线性DP

    #include <iostream> #include <algorithm> #include <string> #include <cstring> ...

  5. POJ 1458 Common Subsequence (DP+LCS,最长公共子序列)

    题意:给定两个字符串,让你找出它们之间最长公共子序列(LCS)的长度. 析:很明显是个DP,就是LCS,一点都没变.设两个序列分别为,A1,A2,...和B1,B2..,d(i, j)表示两个字符串L ...

  6. POJ 1159 Palindrome-最长公共子序列问题+滚动数组(dp数组的重复利用)(结合奇偶性)

    Description A palindrome is a symmetrical string, that is, a string read identically from left to ri ...

  7. HDU 1159 Common Subsequence --- DP入门之最长公共子序列

    题目链接 基础的最长公共子序列 #include <bits/stdc++.h> using namespace std; ; char c[maxn],d[maxn]; int dp[m ...

  8. POJ 2250(最长公共子序列 变形)

    Description In a few months the European Currency Union will become a reality. However, to join the ...

  9. hdu1243 dp (类最长公共子序列)

    题意:射击演习中,已知敌人出现的种类顺序,以及自己的子弹种类顺序,当同种类的子弹打到同种类的敌人时会得到相应分数,问最多能得多少分. 这题的题意很好理解,而且模型也很常见,是带权值的类最长公共子序列问 ...

随机推荐

  1. poj 1515+poj 1438(边双连通)

    题目链接:http://poj.org/problem?id=1515 思路:题目的意思是说将一个无向图改成有向图,使其成为强连通,输出所有的边.我们可以求无向图的边双连通分量,对于同一个双连通分量, ...

  2. SSH配置免秘钥登录

    一.  SSH 配置免秘要登录 配置SSH 免秘要登录,虽然就那么几步,但总是会出现点小问题,今天就做下记录.SSH 免秘钥就是让两台机器相互信任,不需要输入密码就能相互登录.配置相互信任就是把各自的 ...

  3. JSON查看小工具

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programming Langu ...

  4. jQuery EasyUI介绍

    官方定义:http://www.jeasyui.com/ what is JQuery EasyUI ? jQuery EasyUI framework helps you build your we ...

  5. python系列四:Python3字符串

    #!/usr/bin/python #Python3 字符串#可以截取字符串的一部分并与其他字段拼接var1 = 'Hello World!'print ("已更新字符串 : ", ...

  6. 启动hadoop集群

    1.配置core-site.xml(每个节点上都要配置) 路径: /usr/local/hadoop-2.7.3/etc/hadoop/core-site.xml 配置项1: name: fs.def ...

  7. python 获取当前运行的 class 和 方法的名字

    # coding=utf-8 import sys class Hello(): def hello(self): print('the name of method is ## {} ##'.for ...

  8. JavaWeb—拦截器Interceptor

    1.概念 java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取A ...

  9. Python基础-序列化(json/pickle)

    我们把对象(变量)从内存中变成可存储的过程称之为序列化,比如XML,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等 ...

  10. Kafka高可用的保证

    zookeeper作为去中心化的集群模式,消费者需要知道现在那些生产者(对于消费者而言,kafka就是生产者)是可用的.    如果没有zookeeper每次消费者在消费之前都去尝试连接生产者测试下是 ...