LightOJ 1013 - Love Calculator(LCS)

原创 2015年11月18日 19:49:00

题意:给两个字符串s1和s2,求一个最短的字符串使得s1和s2均为这个字符串的字串,问这个串多长,这样的串有多少个。

思路:显然,串长 = s1和s2的长度和 - LCS(s1,s2)。进行一次dp求出LCS后,再dp一次,求出种数。cnt[i][j]表示s1的前i和s2的前j求得满足对于s1前i和s2前j的串有多少种。显然,当s1[i] == s2[j]时,我们只能以s1[i]这个字符结尾;不等时,我们既可以以s1[i]结尾也可以以s2[j]结尾,前提转移方向是朝向对应的字符串这里转移的。即dp[i][j-1] == dp[i-1][j]时,既可以以s1[i]结尾也可以以s2[j]结尾。

代码:

#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <string>
#include <queue>
#include <stack>
#include <cmath>
#include <set>
#include <map>
using namespace std;

typedef long long LL;
#define mem(a, n) memset(a, n, sizeof(a))
#define rep(i, n) for(int i = 0; i < (n); i ++)
#define REP(i, t, n) for(int i = (t); i < (n); i ++)
#define FOR(i, t, n) for(int i = (t); i <= (n); i ++)
#define ALL(v) v.begin(), v.end()
#define si(a) scanf("%d", &a)
#define sii(a, b) scanf("%d%d", &a, &b)
#define siii(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define pb push_back
#define eps 1e-8
const int inf = 0x3f3f3f3f, N = 30 + 5, MOD = 1e9 + 7;

int T, cas = 0;
int n, m;
int dp[N][N];
LL cnt[N][N];
char s1[N], s2[N];

int main(){
#ifdef LOCAL
    freopen("/Users/apple/input.txt", "r", stdin);
//	freopen("/Users/apple/out.txt", "w", stdout);
#endif
	
    si(T);
    while(T --) {
    	mem(dp, 0), mem(cnt, 0);
    	scanf("%s", s1 + 1);
    	scanf("%s", s2 + 1);
    	n = strlen(s1 + 1), m = strlen(s2 + 1);
    	for(int i = 1; i <= n; i ++) {
    		for(int j = 1; j <= m; j ++) {
    			if(s1[i] == s2[j]) dp[i][j] = dp[i-1][j-1] + 1;
    			else dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
    		}
    	}
    	for(int i = 0; i <= m; i ++) cnt[0][i] = 1;
    	for(int i = 0; i <= n; i ++) cnt[i][0] = 1;

    	for(int i = 1; i <= n; i ++) {
    		for(int j = 1; j <= m; j ++) {
    			if(s1[i] == s2[j]) cnt[i][j] = cnt[i-1][j-1];
    			else {
    				if(dp[i][j] == dp[i-1][j]) cnt[i][j] += cnt[i-1][j];
    				if(dp[i][j] == dp[i][j-1]) cnt[i][j] += cnt[i][j-1];
    			}
    		}
    	}
    	printf("Case %d: %d %lld\n", ++ cas, n + m - dp[n][m], cnt[n][m]);
    }
    
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

【LightOJ 1013】Love Calculator(LCS+DP)

Problem DescriptionYes, you are developing a ‘Love calculator’. The software would be quite complex ...

LightOJ 1013 - Love Calculator (LCS + dp)

题意: |L|
  • lwt36
  • lwt36
  • 2015年11月13日 02:22
  • 193

LightOJ 1013 Love Calculator 【DP(LCS变形)】

题目链接题意给两个字符串,求长度最短的字符串的长度以及个数,使得给出的两个串都是这个串的子串。分析LCS的变形,首先长度自然是len(s1)+len(s2)-len(LCS)。关键是有多少个这样的字符...
  • DrCarl
  • DrCarl
  • 2016年08月09日 16:51
  • 174

LightOJ 1013 - Love Calculator(DP)

题意:给你两个字符串str1,str2,要求求以这两个字符串为不下降子序列的字符串det最小长度,并且求出该字符串det的组合方式有多少种。 这个算是一道简单的DP题。第一个问题的关键是求两个字符串s...

LightOJ1013---Love Calculator (dp)

Yes, you are developing a ‘Love calculator’. The software would be quite complex such that nobody co...

LightOJ 1013 - Love Calculator

题意:题意就是给你两个字符串,求能同事包含这两个字符串的最短串的长度和种数。 一个结论:最长包含串的长度=len(s)+len(t)-len(lcs(s,t)). 另外统计的方法和求lcs的方程转移差...
  • CQUWEL
  • CQUWEL
  • 2015年11月20日 21:32
  • 185

light oj 1013 - Love Calculator(DP求两个字符串的构造序列方法)

1013 - Love Calculator     PDF (English) Statistics Forum Time Limit: 2 second(s) Memory...

Light OJ 1013 Love Calculator

题目大意: 给你两个字符串a, b,问存在多少个这样的字符串。这样的字符串是指字符串a和字符串b都是该字符串的子串, 且这样的字符串要求长度最小。 输出这样的字符串的长度和存在多少个...
  • TXT003
  • TXT003
  • 2016年06月13日 09:17
  • 190

loj 1013(LCS+记忆化搜索)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25839 思路:第一小问可以很快求出了,两个字符串的长度-LCS,...
  • zjsyhjh
  • zjsyhjh
  • 2014年05月26日 18:08
  • 271

lightoj 1033【区间DP/LCS】

题意: 给你一个长度j的最少数量。 然后扩大,就好了吧。 如果区间的两端是相同:dp[i,j]=dp[i+1,j-1]的大小。 然后倒着枚举起点,然后区间大小慢慢扩...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LightOJ 1013 - Love Calculator(LCS)
举报原因:
原因补充:

(最多只允许输入30个字)