集训第五周动态规划 D题 LCS
Description
Therefore the German government requires a program for the following task:
Two politicians each enter their proposal of what to do. The computer then outputs the longest common subsequence of words that occurs in both proposals. As you can see, this is a totally fair compromise (after all, a common sequence of words is something what both people have in mind).
Your country needs this program, so your job is to write it for us.
Input
Each test case consists of two texts. Each text is given as a sequence of lower-case words, separated by whitespace, but with no punctuation. Words will be less than 30 characters long. Both texts will contain less than 100 words and will be terminated by a line containing a single '#'.
Input is terminated by end of file.
Output
Sample Input
die einkommen der landwirte
sind fuer die abgeordneten ein buch mit sieben siegeln
um dem abzuhelfen
muessen dringend alle subventionsgesetze verbessert werden
#
die steuern auf vermoegen und einkommen
sollten nach meinung der abgeordneten
nachdruecklich erhoben werden
dazu muessen die kontrollbefugnisse der finanzbehoerden
dringend verbessert werden
#
Sample Output
die einkommen der abgeordneten muessen dringend verbessert werden 这道题是LCS的变种,只需把数组类型改成string就可以了,重点在于对LCS模版的理解
LCS:求解最长公共子序列,由于动态规划无非是递归的一种优化,不如先来看看递归的解法
LCS(i,j)表示数组以数组1的i个为止和以数组2的第j个为止的最长公共子序列,注意是第i个字符为子串的末尾字符(这样才能达到无后效性的目的)
1.LCS(i-1,j-1)+1 (a【i】=b【j】)
LCS(i,j)={
2.max{LCS(i-1,j),LCS(i,j-1)} (a【i】!=b【j】) 对比递归,就能写出状态转移方程,可以用二维数组dp【i】【j】来表示状态LCS(i,j)
不过这个动态规划方程属于从已知推未知型,要特别注意给初始值 1.dp【i-1】【j-1】+1 (a【i】=b【j】) //如果相等,公共串的长度又加一了
2.dp【i】【j】={ 2.dp【0】【i】=0,dp【i】【0】=0 //初始值,如果某个数组的长度为0,那没必要说公共串了
3.max{dp【i-1】【j】,dp【i】【j-1】} (a【i】!=b【j】) //如果不相等,只能选择前一个值最大的状态
然后再因题制宜,在dp寻求最长公共子串时记录一下选了哪些字符,最后输出就好
#include"iostream"
#include"cstring"
#include"cstdio"
using namespace std; const int maxn=;
string a[maxn],b[maxn],ans[maxn];
int dp[maxn][maxn],c[maxn][maxn],m,n; void Init()
{
memset(dp,,sizeof(dp));
int i=,j=;
while(cin>>a[i]&&a[i]!="#") {i++;dp[i][]=;}
m=i-;
while(cin>>b[j]&&b[j]!="#") {j++;dp[][j]=;}
n=j-;
// memset(dp,0,sizeof(dp));
} void Work()
{
memset(c,,sizeof(c));
for(int i=;i<=m;i++)
{
for(int j=;j<=n;j++)
{
if(a[i]==b[j]) {dp[i][j]=dp[i-][j-]+;c[i][j]=;}
else
{
if(dp[i-][j]>dp[i][j-])
{
dp[i][j]=dp[i-][j];
c[i][j]=;
}
else
{
dp[i][j]=dp[i][j-];
c[i][j]=;
}
}
}
}
} void Print()
{
int mn=dp[m][n];
int i=m,j=n;
while(mn)
{
while(c[i][j]!=)
{
if(c[i][j]==) i--;
else j--;
}
ans[mn]=a[i];
mn--;
i--;j--;
}
int k;
for(k=;k<dp[m][n];k++) cout<<ans[k]<<" ";
cout<<ans[k]<<endl;
} int main()
{
while(cin>>a[])
{
Init();
Work();
Print();
}
return ;
}
O(^_^)O
集训第五周动态规划 D题 LCS的更多相关文章
- 集训第五周 动态规划 B题LIS
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Des ...
- 集训第五周动态规划 I题 记忆化搜索
Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...
- 集训第五周动态规划 H题 回文串统计
Hrdv is interested in a string,especially the palindrome string.So he wants some palindrome string.A ...
- 集训第五周动态规划 G题 回文串
Description A palindrome is a symmetrical string, that is, a string read identically from left to ri ...
- 集训第五周动态规划 F题 最大子矩阵和
Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous s ...
- 集训第五周动态规划 C题 编辑距离
Description Let x and y be two strings over some finite alphabet A. We would like to transform x int ...
- 集训第五周 动态规划 K题 背包
K - 背包 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- 集训第五周动态规划 J题 括号匹配
Description We give the following inductive definition of a “regular brackets” sequence: the empty s ...
- 集训第五周动态规划 E题 LIS
Description The world financial crisis is quite a subject. Some people are more relaxed while others ...
随机推荐
- 浅谈KMP算法——Chemist
很久以前就学过KMP,不过一直没有深入理解只是背代码,今天总结一下KMP算法来加深印象. 一.KMP算法介绍 KMP解决的问题:给你两个字符串A和B(|A|=n,|B|=m,n>m),询问一个字 ...
- [Usaco2017 Feb]Why Did the Cow Cross the Road I (Gold)
Description 有一幅n*n的方格图,n <=100,每个点上有一个值. 从(1,1)出发,走到(n,n),只能走上下左右. 每走一步花费t,每走三步需要花费走完三步后到达格子的值. 求 ...
- _bzoj1013 [JSOI2008]球形空间产生器sphere【高斯消元】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1013 保存高斯消元模版. ps,这一题的英文名字是ヨスガノソラ的开发商~^_^ #inclu ...
- 转 oracle apex 使用
https://wenku.baidu.com/view/e5a4226955270722182ef725.html
- 关于Swing中JFrame等顶级容器的层次还有设置背景的方式
资料来自:http://blog.csdn.net/qq_32006373/article/details/49659129 http://yuncode.net/code/c_5196327caac ...
- hihocoder offer收割编程练习赛12 A 歌德巴赫猜想
思路: 枚举. 实现: #include <iostream> #include <cstdio> #include <algorithm> using names ...
- Dragger2解析(一)
依赖注入(DI-Dependency Injection) 什么是依赖注入 这是一种设计思想,一个面向对象的编程法则. DI能够让开发者写出低耦合代码,更加优良的程序. 更容易测试,代码健壮性更强. ...
- R in action读书笔记(16)第十二章 重抽样与自助法之 置换检验
第十二章:重抽样与自助法 本章,我们将探究两种应用广泛的依据随机化思想的统计方法:置换检验和自助法 12.1 置换检验 置换检验,也称随机化检验或重随机化检验. 有两种处理条件的实验,十个受试者已经被 ...
- Farseer.net轻量级ORM开源框架 V1.x 教程目录
本篇教程将以Ver 1.x版本进行详细使用讲解 大家有任何疑问可以加入我们的官方QQ群进行讨论.QQ群:116228666 (Farseer.net开源框架交流) 请注明:Farseer.Net 整个 ...
- 深入理解java虚拟机---垃圾收集器和分配策略-1
博文重点: 学习目标:哪些内存需要回收 什么时候回收 如何回收 在基于概念讨论的模型中,主要对Java堆和方法区进行讨论. why?:一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个 ...