题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25839

思路:第一小问可以很快求出了,两个字符串的长度-LCS,然后第二问就要记忆化搜索了,dp[i][j][l]表示A串的前i个和B串的前j个组合,长度为l的组合数。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 33
#define FILL(a,b) memset(a,b,sizeof(a))
typedef long long ll; int n,len,len1,len2,dp1[MAXN][MAXN];
ll dp2[MAXN][MAXN][MAXN*]; char str1[MAXN],str2[MAXN];
int LCS()
{
FILL(dp1,);
for(int i=;i<=len1;i++){
for(int j=;j<=len2;j++){
if(str1[i-]==str2[j-])dp1[i][j]=dp1[i-][j-]+;
else dp1[i][j]=max(dp1[i-][j],dp1[i][j-]);
}
}
return dp1[len1][len2];
} ll dfs(int l1,int l2,int l)
{
if(dp2[l1][l2][l]!=-)return dp2[l1][l2][l];
else if(l==len)return l1==len1&&l2==len2;
else if(l1==len1)return dp2[l1][l2][l]=dfs(l1,l2+,l+);
else if(l2==len2)return dp2[l1][l2][l]=dfs(l1+,l2,l+);
else if(str1[l1]==str2[l2])return dp2[l1][l2][l]=dfs(l1+,l2+,l+);
return dp2[l1][l2][l]=dfs(l1+,l2,l+)+dfs(l1,l2+,l+);
} int main()
{
int _case=;
scanf("%d",&n);
while(n--){
scanf("%s%s",str1,str2);
len1=strlen(str1),len2=strlen(str2);
len=len1+len2-LCS();
FILL(dp2,-);
printf("Case %d: %d %lld\n",_case++,len,dfs(,,));
}
return ;
}

最新文章

  1. css雪碧图生成工具4.1更新
  2. ZOJ 3699 Dakar Rally
  3. letter upper lower combo
  4. Vijos1019 补丁VS错误[最短路 状态压缩]
  5. 创业这三年¥.NET之尴尬处境
  6. MyBatis操作指南-搭建项目基础环境(基于Java API)含log4j2配置
  7. HDU 2577(DP)
  8. 38-语言入门-38-Coin Test
  9. javascript学习代码
  10. C#利用lambda实现委托事件的挂接
  11. linux查找文件的命令【转】
  12. find指令参数
  13. (30)批处理文件.bat
  14. 腾讯云服务器搭建Apache/PHP/MySQL环境
  15. 移动端适配单位rem
  16. You-Get——基于Python3的媒体下载工具
  17. java自学总结
  18. Spring Bean装配学习
  19. sql两列相除,保留n位小数
  20. mysql备份恢复详解

热门文章

  1. Linux SSH安全策略限制IP登录方法(转)
  2. 转:Java NIO系列教程(一)Java NIO 概述
  3. SqlDataReader执行带输出参数存储过程 错误分析
  4. DOM: 如何获取元素下的第一个子元素
  5. Integer Inquiry
  6. cocos2dx+lua注册事件函数详解
  7. Android EditText的设置
  8. [Effective JavaScript 笔记]第41条:将原型视为实现细节
  9. FOJ 1205
  10. 【持续集成】[Jenkins]Job中如何传递自定义变量