博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1159 Common Subsequence 动态规划
阅读量:5124 次
发布时间:2019-06-13

本文共 1345 字,大约阅读时间需要 4 分钟。

2017-08-06 15:41:04

writer:pprp

刚开始学dp,集训的讲的很难,但是还是得自己看,从简单到难,慢慢来(如果哪里有错误欢迎各位大佬指正)

题意如下:

给两个字符串,找到其中大的公共子序列,每个样例输出一个数;

最长公共子串(Longest Common Substirng)和最长公共子序列(Longest Common Subsequence,LCS)的区别为:

  子串是串的一个连续的部分,子序列则是从不改变序列的顺序,而从序列中去掉任意的元素而获得新的序列;

  也就是说,子串中字符的位置必须是连续的,子序列则可以不必连续。

动态规划的思想:abcfbc 和 abfcab找匹配值(图是大佬画的,借用一下^_^)

  

可以看出:

状态的定义:

  当前匹配到某一位置时已经匹配的数目

状态转移:设记录匹配状态的二维数组叫a[1001][1001]

    如果str1[i] == str2[j] 那么a[i][i] = a[i-1][j-1] + 1;

    如果str1[i] != str2[j] 那么a[i][j] = max(a[i-1][j], a[i][j-1]);

状态结束:

    匹配完成


 

代码如下:

  

#include 
#include
#include
using namespace std;int a[1001][1001];int _max(int a, int b){ return a > b ? a : b;}int main(){ string str1,str2; while(cin >> str1 >> str2) { int len1 = str1.length(); int len2 = str2.length(); memset(a,0,sizeof(a)); for(int i = 1 ; i <= len1 ; i++) { for(int j = 1 ; j <= len2 ; j++) { if(str1[i-1] == str2[j-1]) { a[i][j] = a[i-1][j-1] + 1; } else { a[i][j] = _max(a[i-1][j],a[i][j-1]); } } } cout << a[len1][len2] << endl; } return 0;}

提交状态:ac

转载于:https://www.cnblogs.com/pprp/p/7295014.html

你可能感兴趣的文章
GIT在Linux上的安装和使用简介
查看>>
基于C#编程语言的Mysql常用操作
查看>>
s3c2440实验---定时器
查看>>
MyEclipse10安装SVN插件
查看>>
[转]: 视图和表的区别和联系
查看>>
Regular Experssion
查看>>
图论例题1——NOIP2015信息传递
查看>>
CocoaPods的安装和使用那些事(Xcode 7.2,iOS 9.2,Swift)
查看>>
Android 官方新手指导教程
查看>>
幸运转盘v1.0 【附视频】我的Android原创处女作,请支持!
查看>>
UseIIS
查看>>
集合体系
查看>>
vi命令提示:Terminal too wide
查看>>
引用 移植Linux到s3c2410上
查看>>
MySQL5.7开多实例指导
查看>>
[51nod] 1199 Money out of Thin Air #线段树+DFS序
查看>>
Red and Black(poj-1979)
查看>>
分布式锁的思路以及实现分析
查看>>
腾讯元对象存储之文件删除
查看>>
jdk环境变量配置
查看>>