题目链接:BZOJ - 5282

题目分析

LCS 就是用经典的 O(n^2) DP 解决,f[i][j] 表示 x 串前 i 个字符与 y 串前 j 个字符的 LCS 长度。

f[i][j] = max(f[i - 1][j], f[i][j - 1]);

if (x[i] == y[j]) f[i][j] = max(f[i][j], f[i - 1][j - 1] + 1);

然后再设置一个状态 g[i][j], 表示 x 串的前 i 个字符中,有多少个长为 f[i][j] 的子序列同时也是 y 串前 j 个字符的子序列。

然后转移的时候,分两种情况:

1) 不包含 x[i] 的子序列, if (f[i - 1][j] == f[i][j]) g[i][j] += g[i - 1][j];

2)包含 x[i] 的子序列,if (f[i - 1][p - 1] + 1 == f[i][j]) g[i][j] += g[i - 1][p - 1]; (p 是 y 串前 j 个字符中最靠后的与 x[i] 相同的位置。)

这样转移就好了。

初始化 g[][] 的时候给 g[0][] 和 g[][0] 赋值。

代码

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm> using namespace std; inline int gmax(int a, int b) {return a > b ? a : b;} const int MaxN = 1000 + 5, Mod = 1000000007; int T, n, m, Lp;
int f[MaxN][MaxN], g[MaxN][MaxN]; char X[MaxN], Y[MaxN]; int main()
{
scanf("%d", &T);
for (int Case = 1; Case <= T; ++Case)
{
scanf("%s%s", X + 1, Y + 1);
n = strlen(X + 1);
m = strlen(Y + 1);
memset(f, 0, sizeof(f));
memset(g, 0, sizeof(g));
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
{
f[i][j] = gmax(f[i - 1][j], f[i][j - 1]);
if (X[i] == Y[j]) f[i][j] = gmax(f[i][j], f[i - 1][j - 1] + 1);
}
g[0][0] = 1;
for (int i = 1; i <= n; ++i) g[i][0] = 1;
for (int i = 1; i <= m; ++i) g[0][i] = 1;
for (int i = 1; i <= n; ++i)
{
Lp = 0;
for (int j = 1; j <= m; ++j)
{
if (Y[j] == X[i]) Lp = j;
if (f[i - 1][j] == f[i][j])
{
g[i][j] += g[i - 1][j];
g[i][j] %= Mod;
}
if (Lp != 0 && f[i - 1][Lp - 1] + 1 == f[i][j])
{
g[i][j] += g[i - 1][Lp - 1];
g[i][j] %= Mod;
}
}
}
printf("%d\n", g[n][m]);
}
return 0;
}

  

[HDOJ - 5282] Senior's String 【DP】的更多相关文章

  1. HDOJ 1257 最少拦截系统 【DP】

    HDOJ 1257 最少拦截系统 [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...

  2. hdoj 2046 骨牌铺方格 【DP】+【斐波那契】

    dp果然不是好学的... 第n个,即2*n时,可由第n-1个的竖直排列再加一个,和第n-2个中横着排两个 所以f(n) = 1×f(n-1) + 1×f(n-2): 骨牌铺方格 Time Limit: ...

  3. HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】

    HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...

  4. HDOJ 1501 Zipper 【DP】【DFS+剪枝】

    HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

  5. HDOJ 1159 Common Subsequence【DP】

    HDOJ 1159 Common Subsequence[DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...

  6. Kattis - honey【DP】

    Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ...

  7. HDOJ_1087_Super Jumping! Jumping! Jumping! 【DP】

    HDOJ_1087_Super Jumping! Jumping! Jumping! [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...

  8. POJ_2533 Longest Ordered Subsequence【DP】【最长上升子序列】

    POJ_2533 Longest Ordered Subsequence[DP][最长递增子序列] Longest Ordered Subsequence Time Limit: 2000MS Mem ...

  9. HackerRank - common-child【DP】

    HackerRank - common-child[DP] 题意 给出两串长度相等的字符串,找出他们的最长公共子序列e 思路 字符串版的LCS AC代码 #include <iostream&g ...

随机推荐

  1. oracle学习总结4

    1:三范式a:一张表里必须要有主键,列不可分.b:如果一张表里面,两个字段作为主键,那么其他字段不能够部分依赖这两个字段. 2:pl sql:Procedural language(过程语言) 写一个 ...

  2. javascript的函数传参(没有引用传递只有值传递)

    var v1 = [] var v2 = {}; var v3 = {}; function foo(v1, v2, v3){    v1 = [1];    v2 = [2];    v3 = {a ...

  3. I2C总线协议的总结介绍

    在看天翔哥的视频之后,他强调要把I2C协议好好研究一下,那么就对一些基本的通信手段是十分有帮助的..那么就来了解一下I2C总线协议的一些知识吧. I2C(Inter-Integrated Circui ...

  4. 【JDK源码系列】ConcurrentHashMap

    并发永远是高性能的话题,而并发容器又是java中重要的并发工具,所以今天我们来分析一下Concurrent包中ConcurrentHashMap(以下简称Chashmap).普通容器在某些并发情况下的 ...

  5. hadoop vs spark

    http://www.zhihu.com/question/26568496#answer-12035815 Hadoop首先看一下Hadoop解决了什么问题,Hadoop就是解决了大数据(大到一台计 ...

  6. 关于error: cannot connect to daemon的解决办法

    执行adb devices时,如果出现以下错误: * daemon not running. starting it now on port 5037 * ADB server didn't ACK ...

  7. R cannot be resolved to a variable 解决办法

    Android开发过程中,碰到R cannot be resolved to a variable的报错信息,好像没有很确定的错误原因,一般来说,我总结出几个可能的解决方法,希望试过以后管用... 1 ...

  8. items 与iteritems

    dict的items函数返回的是键值对的元组的列表,而iteritems使用的是键值对的generator. items当使用时会调用整个列表 iteritems当使用时只会调用值. >> ...

  9. Brackets 配置

    插件 Brackets Icons  左侧导航的文件图标 FuncDocr  注释工具 QuickDocsJS  js帮助文档 Beautify  格式化代码 Brackets Git  git支持 ...

  10. ###Fedora下安装Retext

    使用Markdown. #@date: 2012-05-07 #@author: gr #@email: forgerui@gmail.com 因为习惯了Markdown的简单,所以需要在自己的Fed ...