【lightoj1013 - Love Calculator】DP+LCS
2018-01-31 15:40
344 查看
题目链接:点击打开链接
【题意】
给定两个字符串,求最短的新串长度和数量,要求新串必须包含两个子串。
【思路】
新串长度可以用l1 + l2 - lcs求出,lcs代表最长公共子序列。
设num[i][j]为s1取第i个字符、s2取第j个字符的数量,num[l1][l2]即为所求。转移方程如下:
解释一下,当s1[i]
!= s2[j]时,为了让新串最短,需要lcs尽可能的长,所以lcs长的状态即为num的状态,当lcs[i-1][j] = lcs[i][j-1]时,即这两种方式合并成的新串一样长,所以需要对应加上这两种情况。实在不理解写几个数字算一下就明白了。
初始化问题:由于num仅仅是由上个状态转移而来(lcs不同,有个+1),所以需要初始化,即num[0][j] = num[i][0] = 1。注意边界问题。
【题意】
给定两个字符串,求最短的新串长度和数量,要求新串必须包含两个子串。
【思路】
新串长度可以用l1 + l2 - lcs求出,lcs代表最长公共子序列。
设num[i][j]为s1取第i个字符、s2取第j个字符的数量,num[l1][l2]即为所求。转移方程如下:
解释一下,当s1[i]
!= s2[j]时,为了让新串最短,需要lcs尽可能的长,所以lcs长的状态即为num的状态,当lcs[i-1][j] = lcs[i][j-1]时,即这两种方式合并成的新串一样长,所以需要对应加上这两种情况。实在不理解写几个数字算一下就明白了。
初始化问题:由于num仅仅是由上个状态转移而来(lcs不同,有个+1),所以需要初始化,即num[0][j] = num[i][0] = 1。注意边界问题。
#include <bits/stdc++.h> using namespace std; typedef long long LL; char s1[32], s2[32]; int lcs[32][32]; LL num[32][32]; int main() { int i, j, t, cas = 0; cin>>t; while(t--) { scanf("%s%s", s1, s2); int l1 = strlen(s1); int l2 = strlen(s2); memset(lcs, 0, sizeof lcs); memset(num, 0, sizeof num); for(i = 0; i <= l1; i++) //必须加等号,i=l1-1时下面出现i+1 num[i][0] = 1; for(j = 0; j <= l2; j++) num[0][j] = 1; for(i = 0; i < l1; i++) for(j = 0; j < l2; j++) { if(s1[i] == s2[j]) { lcs[i+1][j+1] = lcs[i][j] + 1; num[i+1][j+1] = num[i][j]; } else { if(lcs[i+1][j] > lcs[i][j+1]) { lcs[i+1][j+1] = lcs[i+1][j]; num[i+1][j+1] = num[i+1][j]; } else if(lcs[i+1][j] < lcs[i][j+1]) { lcs[i+1][j+1] = lcs[i][j+1]; num[i+1][j+1] = num[i][j+1]; } else { lcs[i+1][j+1] = lcs[i][j+1]; num[i+1][j+1] = num[i][j+1] + num[i+1][j]; } } } printf("Case %d: %d %lld\n", ++cas, l1 + l2 - lcs[l1][l2], num[l1][l2]); } return 0; }
相关文章推荐
- LightOJ 1013 Love Calculator (LCS+DP)
- Love Calculator(LightOJ-1013)(LCS+DP)
- LightOJ - 1013 Love Calculator(LCS + DP)
- LightOJ 1013 - Love Calculator (LCS + dp)
- lightoj 1013 Love Calculator (LCS+dp)
- LightOJ-1013-Love Calculator [LCS][DP]
- 【LightOJ 1013】Love Calculator(LCS+DP)
- ☆lightoj1013 Love Calculator 两种转移方程详解(LCS+方案数DP)
- LightOJ 1013 Love Calculator 【DP(LCS变形)】
- lightoj 1013 - Love Calculator 【LCS 变形】
- LightOJ1013 Love Calculator(DP)
- LightOJ 1013 - Love Calculator(dp)
- LightOJ 1013 - Love Calculator(DP)
- LightOJ1013---Love Calculator (dp)
- LightOJ1013-Love Calculator-dp
- Lightoj1013【DP_LCS】
- LightOJ 1013 Love Calculator(LCS)
- LightOJ 1013 - Love Calculator(LCS)
- Light OJ 1013 - Love Calculator(LCS+ 计方案数)
- light oj 1013 - Love Calculator(DP求两个字符串的构造序列方法)