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 变形】

题目链接:lightoj 1013 - Love Calculator1013 - Love Calculator PDF (English) Statistics Forum...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2016年04月07日 18:04
  • 430

Light OJ 1013 Love Calculator (dp)

好久没写博客了……(这个习惯没有坚持住……感觉自己实力下滑好快额 题意:给你两个字符串,求最短字符串的长度和个数,使得两个字符串是这个字符串的子串。 解析:设两个字符串 A、B,长度为n、m。...
  • qq_26572969
  • qq_26572969
  • 2016年02月01日 15:00
  • 259

LightOJ 1013 Love Calculator(LCS)

Love Calculator Time Limit: 2000msMemory Limit: 32768KB 64-bit integer IO format: %lld Java cl...
  • mrlry
  • mrlry
  • 2016年07月26日 15:41
  • 157

LightOJ - 1013 Love Calculator(LCS + DP)

题目大意:给你2个字符串,要求你求出另外一个字符串,这个字符串的子串(可以不连续)包含这两个字符串,且这个字符串的长度要最短,并问,有多少种组成方式解题思路:字符串的最短长度就是两个字符串的长度和-L...
  • L123012013048
  • L123012013048
  • 2015年10月27日 22:41
  • 578

LightOJ 1013 - Love Calculator

题意:给出两个人的名字a,b,找到一个最短的字符串s,使得a,b,都是s的子串,同时,输出对应s的个数。 题目链接 解决方法:对于s的长度确定,很容易想到求出最长公共字串,length (s...
  • huaxixidongbeishida
  • huaxixidongbeishida
  • 2013年09月02日 07:41
  • 1420

lightoj 1013 - Love Calculator

先求个最长公共子序列的长度,dp1[i][j]表示装下X[1...i],Y[1...j]这两个串需要的最小长度。 X[i] == Y[j],dp[i][j] = dp[i-1][j-1] + 1; ...
  • KIJamesQi
  • KIJamesQi
  • 2016年01月16日 14:13
  • 152

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

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

LightOJ 1013 - Love Calculator (LCS + dp)

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

【LightOJ 1013】Love Calculator(LCS+DP)

Problem DescriptionYes, you are developing a ‘Love calculator’. The software would be quite complex ...
  • iceiceicpc
  • iceiceicpc
  • 2016年07月26日 20:17
  • 161

lightoj 1013 Love Calculator (LCS+dp)

Yes, you are developing a 'Love calculator'. The software would be quite complex such that nobody co...
  • zs120197
  • zs120197
  • 2017年08月23日 16:27
  • 105
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LightOJ 1013 - Love Calculator(LCS)
举报原因:
原因补充:

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