Light oj 1013 - Love Calculator (LCS变形)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1013
题意:
给你两个字符串,让你构造出一个长度最小的字符串,且它的子序列包含这两个字符串。问它的长度,和多少种情况。
思路:
长度的话就是lena + lenb - LCS,这个比较明显。情况数比较难算。
dp[i][j][k]表示a字符串前i个字符 b字符串前j个字符构成长度为k的字符串有多少种情况。
(1)a[i] == b[i] 就是dp[i][j][k] = dp[i - 1][j - 1][k - 1] 。(2)a[i] != b[j] 的话分两种情况,a[i]在k位置和b[j]在k位置
感觉比较难。。。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
char a[], b[];
int _len[][];
LL dp[][][]; int main()
{
int t;
scanf("%d", &t);
for(int ca = ; ca <= t; ++ca) {
scanf("%s%s", a, b);
memset(_len, , sizeof(_len));
memset(dp, , sizeof(dp));
int len1 = strlen(a), len2 = strlen(b);
for(int i = ; i <= len1; ++i) {
for(int j = ; j <= len2; ++j) {
if(a[i - ] == b[j - ]) {
_len[i][j] = _len[i - ][j - ] + ;
} else {
_len[i][j] = max(_len[i - ][j], _len[i][j - ]);
}
}
}
int len = len1 + len2 - _len[len1][len2];
for(int i = ; i <= len1; ++i) {
dp[i][][i] = ; //初始化
}
for(int j = ; j <= len2; ++j) {
dp[][j][j] = ; //初始化
}
for(int i = ; i <= len1; ++i) {
for(int j = ; j <= len2; ++j) {
for(int k = ; k <= len; ++k) {
if(a[i - ] == b[j - ]) {
dp[i][j][k] = dp[i - ][j - ][k - ];
} else {
dp[i][j][k] = dp[i - ][j][k - ] + dp[i][j - ][k - ]; //a字符串的第i位在第k位 + b字符串的第j位在第k位
}
}
}
}
printf("Case %d: %d %lld\n", ca, len, dp[len1][len2][len]);
}
return ;
}
Light oj 1013 - Love Calculator (LCS变形)的更多相关文章
- [light oj 1013] Love Calculator
		
1013 - Love Calculator Yes, you are developing a 'Love calculator'. The software would be quite comp ...
 - Light OJ  1013	Love Calculator(DP)
		
题目大意: 给你两个字符串A,B 要求一个最短的字符串C,使得A,B同时为C的子串. 问C最短长度是多少? C有多少种? 题目分析: 做这道题目的时候自己并没有推出来,看了网上的题解. 1.dp[C串 ...
 - LightOJ 1013 - Love Calculator LCS
		
题意:找一个串使给出的两个串都是它的子串,要求最短,求出最短长度,以及种类数. 思路:可以想到,当两个子串a,b拥有最长的公共子串为LCS时,那么可以求出的最短的串为lena+lenb-LCS. 那么 ...
 - Light OJ Dynamic Programming
		
免费做一样新 1004 - Monkey Banana Problem 号码塔 1005 - Rooks 排列 1013 - Love Calculator LCS变形 dp[i][j][k]对于第一 ...
 - poj 1080 (LCS变形)
		
Human Gene Functions 题意: LCS: 设dp[i][j]为前i,j的最长公共序列长度: dp[i][j] = dp[i-1][j-1]+1;(a[i] == b[j]) dp[i ...
 - Light OJ 1114 Easily Readable 字典树
		
题目来源:Light OJ 1114 Easily Readable 题意:求一个句子有多少种组成方案 仅仅要满足每一个单词的首尾字符一样 中间顺序能够变化 思路:每一个单词除了首尾 中间的字符排序 ...
 - Light OJ 1429 Assassin`s Creed (II) BFS+缩点+最小路径覆盖
		
题目来源:Light OJ 1429 Assassin`s Creed (II) 题意:最少几个人走全然图 能够反复走 有向图 思路:假设是DAG图而且每一个点不能反复走 那么就是裸的最小路径覆盖 如 ...
 - Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖
		
标题来源:problem=1406">Light OJ 1406 Assassin`s Creed 意甲冠军:向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路: ...
 - Light OJ 1316 A Wedding Party 最短路+状态压缩DP
		
题目来源:Light OJ 1316 1316 - A Wedding Party 题意:和HDU 4284 差点儿相同 有一些商店 从起点到终点在走过尽量多商店的情况下求最短路 思路:首先预处理每两 ...
 
随机推荐
- Thinkphp5 获取执行的sql语句
			
获取最后执行的sql语句 $str_order_action = db('order_action')->getLastSql(); //获取最后执行的sql语句 获取执行的sql语句 $ord ...
 - Python基础——数值
			
运算 运算 运算符 示例 加 + 减 - 乘 * 除 / 取余 % 幂 ** 赋值 = 绝对值 abs 取整(四舍五入) round 最大值 max 最小值 min 科学计数法 e 十六进制 0x 逻 ...
 - java做http接口
			
问题描述 我要对外提供一个http接口给别人调用...但是我不知道用java怎么做这个接口.请大家详细给我讲讲.从开发到如何发布到服务器.谢谢了 解决方案 如果你这个很简单的话,而且数量也很少,建议直 ...
 - PAT Basic 1074
			
1074 宇宙无敌加法器 地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的.而在 PAT 星人开挂的世界里,每个数字的每一位都是不同进制的,这种神奇的数字称为“PAT数”.每个 PAT 星 ...
 - #ifndef、#def、#endif说明
			
你所遇到的这几个宏是为了进行条件编译.一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一 部分内容指定编译的条件,这就是“条件编译”.有时,希望 ...
 - 强大的with语句
			
上下文管理器对象存在的目的是管理 with 语句,就像迭代器的存在是为了管理 for 语句一样. with 语句的目的是简化 try/finally 模式.这种模式用于保证一段代码运行完毕后执行某项操 ...
 - 实现socket并发的几种方法
			
# 使用多进程实现socket聊天并发-server #服务端 import socket from multiprocessing import Process def server(conn,ad ...
 - 当列表推导式遇到lambda(匿名函数)
			
Python这么优雅的语言,我也是醉了...... 事情由一段代码引发,请看: 上述的列表推导式+lambda表达式+for循环,他们碰撞出来的结果搞的人晕头转向,咱们逐步来分析一下他们到底是个什么鬼 ...
 - Redhat7配置yum源(本地源和网络源)
			
Redhat7配置yum源(本地源和网络源) 目录 一:配置本地yum源 二:配置网络yum源 YUM(Yellow dog Updater Modified): yum是基于RPM包构建的软件更 ...
 - PHP魔术函数、魔术常量、预定义常量
			
一.魔术函数(13个) 1.__construct() 实例化对象时被调用, 当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用. 2.__des ...