Contest - 河南省多校连萌(四)

Problem G: 沉迷字符的WJJ

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 6  Solved: 5

SubmitWeb Board

Description

WJJ最近迷恋上了字符串,每次大家一起吃饭时他都会在大家面前炫耀一番新学的知识,于是
KKK和FFF决定难为一下WJJ。KKK和FFF分别写一个字符串s1和s2,要求WJJ也写一个字符串s3。
要求WJJ回答两个问题:
       1、s1和s2都为s3的子序列并且使s3的长度最短
       2、s3的组成方案有多少种?
 

Input

  第一行输入一个t,表示t组数据
   然后每组数据输入两个字符串,分别为s1,s2, 0<|s1|<=30, 0<|s2|<=30

Output

输出两个数分别为满足条件的s3的长度len1和方案数sum(sum小于2^63),输出占一行

Sample Input

3
ALKJ
SADIU
AAA
BBB
ABABAB
BABABA

Sample Output

8 20
6 20
7 2

HINT

 #include <bits/stdc++.h>

 using namespace std;

 char s1[], s2[];
long long dp[][], sum[][]; int main ()
{
int t;
cin >> t;
while(t--)
{
cin >> s1+ >> s2+;
int m = strlen(s1+);
int n = strlen(s2+);
memset(sum, , sizeof(sum));
for(int i = ;i <= m;i++) dp[i][] = i, sum[i][] = ;//初始化
for(int i = ;i <= n;i++) dp[][i] = i, sum[][i] = ;
for(int i = ;i <= m;i++)
for(int j = ;j <= n;j++)
{
if(s1[i] == s2[j])
{
dp[i][j] = dp[i-][j-] + ;
sum[i][j] = sum[i-][j-];
}
else
{
dp[i][j] = min(dp[i-][j], dp[i][j-]) + ;
if(dp[i][j-] >= dp[i-][j]) sum[i][j] += sum[i-][j];
if(dp[i-][j] >= dp[i][j-]) sum[i][j] += sum[i][j-];
}
}
printf("%lld %lld\n", dp[m][n], sum[m][n]);
}
return ;
}

LCS的变形, dp[i][j]就是s1中前i个字符和s2中前j个字符可以得到的满足条件的长度
当s1[i] == s2[j]时 dp[i][j] = d[i-1][j-1] + 1
不相等时 dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + 1    //在dp[i-1][j-1]的基础上加上s1或s2中的一个字符取其最短,然后再加一
sum[i][j]表示方案数
当s1[i] == s2[j]时 sum[i][j] = sum[i-1][j-1]      //方案数不变
不相等时 如果dp[i][j-1] == dp[i-1][j], 那么两个方向都可以选择, 所以 sum[i][j] = sum[i-1][j] + sum[i][j-1]
如果dp[i][j-1] < dp[i-1][j] sum[i][j] = sum[i][j-1]    //长度最短时的方案数
如果dp[i][j-1] > dp[i-1][j] sum[i][j] = sum[i-1][j]

感觉这种题如果真正明白了,动态规划的原理其实也没有那么难,这一题的关键主要是理解上面的那段题解。

Problem G: 沉迷字符的WJJ (LCS)的更多相关文章

  1. ZOJ 4010 Neighboring Characters(ZOJ Monthly, March 2018 Problem G,字符串匹配)

    题目链接  ZOJ Monthly, March 2018 Problem G 题意  给定一个字符串.现在求一个下标范围$[0, n - 1]$的$01$序列$f$.$f[x] = 1$表示存在一种 ...

  2. Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem G. k-palindrome dp

    Problem G. k-palindrome 题目连接: http://opentrains.snarknews.info/~ejudge/team.cgi?SID=c75360ed7f2c7022 ...

  3. 实验9:Problem G: 克隆人来了!

    想要输出""的话: cout<<"A person whose name is \""<<name<<" ...

  4. 实验12:Problem C: 重载字符的加减法

    Home Web Board ProblemSet Standing Status Statistics   Problem C: 重载字符的加减法 Problem C: 重载字符的加减法 Time ...

  5. 实验12:Problem G: 强悍的矩阵运算来了

    这个题目主要是乘法运算符的重载,卡了我好久,矩阵的乘法用3个嵌套的for循环进行,要分清楚矩阵的乘法结果是第一个矩阵的行,第二个矩阵的列所组成的矩阵. 重载+,*运算符时,可以在参数列表中传两个矩阵引 ...

  6. 烟大 Contest1024 - 《挑战编程》第一章:入门 Problem G: Check The Check(模拟国际象棋)

    Problem G: Check The Check Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 10  Solved: 3[Submit][Statu ...

  7. The Ninth Hunan Collegiate Programming Contest (2013) Problem G

    Problem G Good Teacher I want to be a good teacher, so at least I need to remember all the student n ...

  8. 【贪心+中位数】【新生赛3 1007题】 Problem G (K)

    Problem G Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Sub ...

  9. Problem G: If We Were a Child Again

    Problem G: If We Were a Child AgainTime Limit: 1 Sec Memory Limit: 128 MBSubmit: 18 Solved: 14[Submi ...

随机推荐

  1. 可视化库-Matplotlib-Pandas与sklearn结合(第四天)

    1. 计算每一种的比例的百分比 import pandas as pd from matplotlib.ticker import FuncFormatter np.random.seed(0) df ...

  2. LUA表与函数的深入理解

    local heroInfo = {} --直接打印 table的名字,就会输出该table的内存地址 print("表地址---------------",heroInfo) - ...

  3. js获取当前项目根路径URL (转自CSDN 红领巾-sunlight)

    /** * //获取当前项目根路径 * @return {TypeName} */ function getRootPath(){ //获取当前网址,如: http://localhost:8083/ ...

  4. android 读取json数据(遍历JSONObject和JSONArray)(转)

    public String getJson(){ String jsonString = "{\"FLAG\":\"flag\",\"MES ...

  5. 48. Rotate Image (Array)

    You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...

  6. Unity5-CacheServer(资源平台切换之缓存服务器)的部署与使用

    不管你是个人还是团队,如果你的资源很多, 而且经常切换平台, 那你试试这个吧~~兼职爽爆了,秒秒钟实现平台间的转换. cache server主要用于资源修改后的自动重新导入功能,保证所见即所得,方便 ...

  7. python socket编程入门(编写server实例)-乾颐堂

    python 编写server的步骤: 1. 第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family参 ...

  8. Java程序设计17——多线程-Part-C

    11 使用管道流 前面介绍的两种方式与其称为线程之间的通信,还不如称为线程之间协调运行的控制策略.如果需要在两条线程之间进行更多的信息交互,则可以考虑使用管道流进行通信. 管道流有3中存在形式:Pip ...

  9. clone一行div tr 每次增量赋值

    $("#add_tan").click(function () { num++; $("tbody tr.tab_xue").eq(0).clone(true) ...

  10. Android 密匙库导出

    导出debug 签名----------------------------- C:\Documents and Settings\Administrator>keytool -list -v ...