[HDOJ - 5282] Senior's String 【DP】
题目链接: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】的更多相关文章
- HDOJ 1257 最少拦截系统 【DP】
HDOJ 1257 最少拦截系统 [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- hdoj 2046 骨牌铺方格 【DP】+【斐波那契】
dp果然不是好学的... 第n个,即2*n时,可由第n-1个的竖直排列再加一个,和第n-2个中横着排两个 所以f(n) = 1×f(n-1) + 1×f(n-2): 骨牌铺方格 Time Limit: ...
- HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】
HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...
- HDOJ 1501 Zipper 【DP】【DFS+剪枝】
HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- HDOJ 1159 Common Subsequence【DP】
HDOJ 1159 Common Subsequence[DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- Kattis - honey【DP】
Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ...
- HDOJ_1087_Super Jumping! Jumping! Jumping! 【DP】
HDOJ_1087_Super Jumping! Jumping! Jumping! [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- POJ_2533 Longest Ordered Subsequence【DP】【最长上升子序列】
POJ_2533 Longest Ordered Subsequence[DP][最长递增子序列] Longest Ordered Subsequence Time Limit: 2000MS Mem ...
- HackerRank - common-child【DP】
HackerRank - common-child[DP] 题意 给出两串长度相等的字符串,找出他们的最长公共子序列e 思路 字符串版的LCS AC代码 #include <iostream&g ...
随机推荐
- 为ubuntu只带的network-manager添加latp/ipsec VPN
sudo apt-add-repository ppa:seriy-pr/network-manager-l2tp sudo apt-get update sudo apt-get install n ...
- 一些实用的js高级技巧
技巧一之setTimeout. 应用案例:比如你想一个函数循环执行10次,怎么办?以前通常是先setInterval,然后clearInterval,技巧一就是克服这个问题 (function () ...
- 【转】ArrayList的toArray,也就是list.toArray[new String[list.size()]];,即List转为数组
[转]ArrayList的toArray ArrayList提供了一个将List转为数组的一个非常方便的方法toArray.toArray有两个重载的方法: 1.list.toArray(); 2.l ...
- php 文件缓存
http://www.oschina.net/code/snippet_162279_6098 <?php class cache { private static $_instan ...
- Merge Into example
merge into users a using temp_users b on (a.userid = b.user_id) when matched then update set a.passw ...
- <Error>: CGContextRestoreGState
<Error>: CGContextRestoreGState: invalid context 0x0. If you want to see the backtrace, please ...
- CBQW ---分组表单展示
工作流审核表单后,将表单信息展示页面中. Rest读取展示 展示方式有2 一. CBQW内容查询, 通过CBQW内容查询.分别通过设置itemstyle和header xsl ...
- php封装文件上传
这是一个经常在项目中遇到的问题,所以封装一个,分享给大家. 一,前期配置php.ini 如果上传文件超过了php配置那么$_POST或者$_FILES等都是空数组,这点是一个坑,因为那时候就不 ...
- 一种c#深拷贝方式完胜java深拷贝(实现上的对比)
楼主是一名asp.net攻城狮,最近经常跑java组客串帮忙开发,所以最近对java的一些基础知识特别上心.却遇到需要将一个对象深拷贝出来做其他事情,而原对象保持原有状态的情况.(实在是不想自己new ...
- HttpClient Post Get请求方法,留在以后可能会用到
/// <summary> /// Post请求返回实体 /// </summary> /// <param name="url">请求地址&l ...