题意:找一个串使给出的两个串都是它的子串,要求最短,求出最短长度,以及种类数。

思路:可以想到,当两个子串a,b拥有最长的公共子串为LCS时,那么可以求出的最短的串为lena+lenb-LCS。 那么接下来直接计算转移数就可以了,和平常求LCS的方法一样。DP[i][j][k]代表到选取了i个时已有j个a串的,k个b串的种类数。

/** @Date    : 2016-12-09-18.39
* @Author : Lweleth (SoungEarlf@gmail.com)
* @Link : https://github.com/
* @Version :
*/
#include<bits/stdc++.h>
#define LL long long
#define PII pair<int ,int>
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std; const int INF = 0x3f3f3f3f;
const int N = 1e5+20;
const double eps = 1e-8; char a[110],b[110];
LL dp[110][50][50];
int main()
{
int T;
int cnt = 0;
cin >> T;
while(T--)
{
scanf("%s%s", &a, &b);
int x = strlen(a);
int y = strlen(b);
int ma = 0;
MMF(dp);
for(int i = 1; i <= x; i++ )
{
for(int j = 1; j <= y; j++)
{
if(a[i-1] == b[j-1])
dp[0][i][j] = dp[0][i - 1][j - 1] + 1;
else dp[0][i][j] = max(dp[0][i][j - 1], dp[0][i - 1][j]);
}
}
int z = x + y - dp[0][x][y];
MMF(dp[0]);
dp[0][0][0] = 1;
for(int i = 1; i <= z; i++)
{
for(int j = 0; j <= x; j++)
{
for(int k = 0; k <= y; k++)
{ if(j > 0 && k > 0 && a[j-1] == b[k-1])
{
dp[i][j][k] += dp[i - 1][j - 1][k - 1];
}
else
{
if(j > 0)
dp[i][j][k] += dp[i - 1][j - 1][k];
if(k > 0)
dp[i][j][k] += dp[i - 1][j][k - 1];
}
//cout << dp[i][j][k] << endl;
}
}
}
printf("Case %d: %d %lld\n", ++cnt, z, dp[z][x][y]); }
return 0;
}

LightOJ 1013 - Love Calculator LCS的更多相关文章

  1. Light oj 1013 - Love Calculator (LCS变形)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1013 题意: 给你两个字符串,让你构造出一个长度最小的字符串,且它的子序列包含 ...

  2. [light oj 1013] Love Calculator

    1013 - Love Calculator Yes, you are developing a 'Love calculator'. The software would be quite comp ...

  3. (最长公共子序列+推导)Love Calculator (lightOJ 1013)

    http://www.lightoj.com/volume_showproblem.php?problem=1013   Yes, you are developing a 'Love calcula ...

  4. lightoj 1013 dp

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1013 #include <cstdio> #include <cst ...

  5. lightoj 1013

    思路:动态规划.设dp[i][j][k]表示用第一个串的前i隔字符和第二个串的前k隔字符组成长度为i的串的个数,那么:若s1[j+1] == s2[k+1] dp[i+1][j+1][k+1] += ...

  6. Light OJ 1013 Love Calculator(DP)

    题目大意: 给你两个字符串A,B 要求一个最短的字符串C,使得A,B同时为C的子串. 问C最短长度是多少? C有多少种? 题目分析: 做这道题目的时候自己并没有推出来,看了网上的题解. 1.dp[C串 ...

  7. Light OJ Dynamic Programming

    免费做一样新 1004 - Monkey Banana Problem 号码塔 1005 - Rooks 排列 1013 - Love Calculator LCS变形 dp[i][j][k]对于第一 ...

  8. lightoj刷题日记

    提高自己的实力, 也为了证明, 开始板刷lightoj,每天题量>=1: 题目的类型会在这边说明,具体见分页博客: SUM=54; 1000 Greetings from LightOJ [简单 ...

  9. loj 1013(LCS+记忆化搜索)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25839 思路:第一小问可以很快求出了,两个字符串的长度-LCS,然 ...

随机推荐

  1. 【转】MySQLroot用户忘记密码解决方案(安全模式,修改密码的三种方式)

    文章出自:http://www.2cto.com/database/201412/358128.html 1.关闭正在运行的MySQL2.启动MySQL的安全模式,命令如下: ? 1 mysqld - ...

  2. js学习之正则表达式

    js学习之正则表达式 正则表达式(英语:Regular Expression,在代码中常简写为regex.regexp或RE)使用单个字符串来描述.匹配一系列符合某个句法规则的字符串搜索模式 一:语法 ...

  3. Java学习个人备忘录之多线程

    进程:正在进行中的程序(直译). 线程:就是进程中一个负责程序执行的控制单元(执行路径) 一个进程中可以有多个执行路径,称之为多线程. 一个进程中至少要有一个线程. 开启多个线程是为了同时运行多部分代 ...

  4. 2017秋-软件工程第四次作业(2)-结对使用TDD框架完成单元测试

    第一次接触“单元测试”这个要求,我和队友学习了一些示例后开始操作.如下展示一些建立单元测试的过程.Step1:右键单击[解决方案]->左键单击[添加(D)]->[新建项目(N)]. Ste ...

  5. how to install pygraphviz on windows 10 with python 3.6

    Here's what worked for me: Win 7 AMD64 Install MSFT C++ compiler. Install Anaconda for Win AMD64, Py ...

  6. 【Docker 命令】- inspect命令

    docker inspect : 获取容器/镜像的元数据. 语法 docker inspect [OPTIONS] NAME|ID [NAME|ID...] OPTIONS说明: -f :指定返回值的 ...

  7. CSS定义input disabled样式

    disabled 属性规定应该禁用 input 元素.被禁用的 input 元素既不可用,也不可点击.可以设置 disabled 属性,直到满足某些其他的条件为止(比如选择了一个复选框等等).然后,就 ...

  8. CMD命令提示符

    mspaint  画图板 notepad  打开记事本 write  写字板 calc.exe  计算器 control.exe  控制面板 osk  打开屏幕键盘 rononce -p ----15 ...

  9. [洛谷P4717]【模板】快速沃尔什变换

    题目大意:给定多项式$A$和$B$,求$C$满足: $$C_n=\sum\limits_{x\oplus y=n}A_xB_y$$ 其中$\oplus$为位运算($or,and,xor​$) 题解:$ ...

  10. [HNOI2012]排队 组合数

    公式:A(n,n)*A(n+1,2)*A(n+3,m) + A(n,n)*C(m,1)*A(2,2)*C(n+1,1)*A(n+2,m-1) 分情况讨论推出公式 前者为无论何时都合法的,后者为先不合法 ...