先上状态转移方程,还是很容易看明白的

例题是Codevs的1862,这个题不是实现了方程就可以了的,还要完成一个事情那就是计数,数一数到底有多少个最长公共子序列

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
const int p=1e8;
char a[maxn],b[maxn];
int dp[maxn][maxn],f[maxn][maxn];
int main()
{
scanf("%s%s",a+,b+);
int al=strlen(a+)-;
int bl=strlen(b+)-;
for(int i=;i<=al;i++) f[i][]=;
for(int i=;i<=bl;i++) f[][i]=;
for(int i=;i<=al;i++)
for(int j=;j<=bl;j++)
{
if(a[i]==b[j])
{
dp[i][j]=dp[i-][j-]+;
int k1=,k2=;
if(dp[i][j]==dp[i-][j]) k1=;
if(dp[i][j]==dp[i][j-]) k2=;
f[i][j]=f[i-][j-]+(k1*f[i-][j])+(k2*f[i][j-]);
f[i][j]=(f[i][j]+p)%p;
}
else
{
dp[i][j]=max(dp[i-][j],dp[i][j-]);
int k1=,k2=,k3=;
if(dp[i][j]==dp[i-][j]) k1=;
if(dp[i][j]==dp[i][j-]) k2=;
if(dp[i][j]==dp[i-][j-]) k3=;
f[i][j]=(k1*f[i-][j])+(k2*f[i][j-])-(k3*f[i-][j-]);
f[i][j]=(f[i][j]+p)%p;
}
}
printf("%d\n%d\n",dp[al][bl],f[al][bl]);
return ;
}

在这里我们用dp记录长度,用f记录个数

由于输入是以“.”结尾的,所以读入的时候有些许的变化

    scanf("%s%s",a+,b+);
int al=strlen(a+)-;
int bl=strlen(b+)-;

这样读入的时候真正的字符串的下标是从a+1开始的,循环的时候从1开始循环,到strlen(a+1)结束

因为结尾字符不属于串,所以给al--就好了

动态规划:LCS的更多相关文章

  1. 算法起步之动态规划LCS

    原文:算法起步之动态规划LCS 前一篇文章我们了解了什么是动态规划问题,这里我们再来看动态规划另一个经典问题,最长公共子序列问题(LCS),什么是子序列,我们定义:一个给定序列将其中的0个或者多个元素 ...

  2. POJ1080 Human Gene Functions 动态规划 LCS的变形

    题意读了半年,唉,给你两串字符,然后长度不同,你能够用'-'把它们补成同样长度,补在哪里取决于得分,它会给你一个得分表,问你最大得分 跟LCS非常像的DP数组 dp[i][j]表示第一个字符串取第i个 ...

  3. 动态规划-LCS最长公共子序列

    #include<iostream> #include<cstdio> #include<cstring> #include<string> using ...

  4. 动态规划 LCS,LIS

    1.最大连续子序列 dp[i]=max(dp[i-1]+a[i],a[i]) 以i为结尾 2.最大不连续子序列 dp[i]=max(dp[j]+a[i],dp[j]) 3.最大连续递增子序列 if a ...

  5. DP动态规划———LCS最长公共子序列

    递推公式: ]==b[j-]) { dp[i][j]=dp[i-][j-]+; } else { dp[i][j]=max(dp[i-][j],dp[i][j-]); } 完整模板代码: int LC ...

  6. Luogu2543[AHOI2004]奇怪的字符串 (动态规划 LCS)

    04年的省选这么water吗,开个滚动数组算了 #include <iostream> #include <cstdio> #include <cstring> # ...

  7. UVA 10066 The Twin Towers(LCS)

    Problem B The Twin Towers Input: standard input Output: standard output Once upon a time, in an anci ...

  8. LCS最大公共子序列问题

    在生物应用中,经常需要比较两个(或多个)不同生物体的DNA, 例如:某种生物的DNA可能为S1=ACCGGTCGAGTGCGCGGAAGCCGGCCGAA, 另一种生物的DNA可能为S2=GTCGTT ...

  9. 2016级算法期末上机-G.中等·Bamboo's Fight with DDLs II

    中等·Bamboo's Fight with DDLs II 分析 一句话:给定字符串,求最长回文子序列长度,动态规划LCS思想的进阶应用 具体思路如下: 对于任意字符串,如果头尾字符相同,那么字符串 ...

  10. 动态规划之最长公共子序列(LCS)

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

随机推荐

  1. 实用脚本 4 -- Makefile(不同文件下的多个可执行文件or静态库编译到同一目录下)

    不同文件下的多个可执行文件编译到同一目录下,这样方便观察编译结果,从而方便进程操作.使用时根据自己的需要在进行局部修改(如 链接库.目标文件等等). 1..bashrc 中设置编译主目录(例如) ex ...

  2. LINUX目录的意思

    Linux系统/目录下的文件夹里面分别是以下内容: /usr 包含所有的命令和程序库.文档和其他文件,还包括当前linux发行版的主要应用程序 /var 包含正在操作的文件,还有记录文件.加密文件.临 ...

  3. Java的HashMap和HashTable

    Java的HashMap和HashTable 1. HashMap 1)  hashmap的数据结构 Hashmap是一个数组和链表的结合体(在数据结构称“链表散列“),如下图示: 当我们往hashm ...

  4. C++学习001-注释

    天了噜,感觉自己最近好堕落啊,  在等待项目任务书到来的时候,在来好好学习学习C++ 今天来学习一下C++的注释风格 编写环境 Qt 5.7 1. //注释 // ui->setupUi(thi ...

  5. Tensorflow Serving介绍及部署安装

    TensorFlow Serving 是一个用于机器学习模型 serving 的高性能开源库.它可以将训练好的机器学习模型部署到线上,使用 gRPC 作为接口接受外部调用.更加让人眼前一亮的是,它支持 ...

  6. 详谈P(查准率),R(查全率),F1值

    怎么来的? 我们平时用的精度accuracy,也就是整体的正确率 acc = predict_right_num / predict_num 这个虽然常用,但不能满足所有任务的需求.比如,因为香蕉太多 ...

  7. liniux备忘录-磁盘配额与进阶文件系统管理

    知识 磁盘配额Quota 可以限制磁盘的使用容量,可以对用户.群组磁盘的最大使用容量. 磁盘配额Quota的使用限制 只能针对整个文件系统. 核心必须支持Quota. 自行编译的核心需要注意 Quot ...

  8. redis基础和通用key操作

    redis是什么? redis开源的,构建于内存的数据结构的nosql数据库.常被用于数据存储,缓存处理和消息处理. redis的优势? 1.极高的读写能力 2.丰富的数据类型 3.原子性操作 4.支 ...

  9. STL应用——hdu1412(set)

    set函数的应用 超级水题 #include <iostream> #include <cstdio> #include <algorithm> #include ...

  10. NO6——KMP

    int next[N]; char str1[M],str2[N]; //str1 长,str2 短 //len1,len2,对应str1,str2的长 void get_next(int len2) ...