Lightoj1013【DP_LCS】
来源:互联网 发布:面板数据 编辑:程序博客网 时间:2024/05/01 20:35
题意:
给你两个字符串,让你求一个最短字符串,其中存在给出串的种类;
求这个字符串的长度和种类;
思路:
//dp[i,j,k]表示前i个字符,包含s1串前j个字母,包含s2串前k个字符时的方案数。
//按照一定的顺序,碰到相同元素只会留一个,不同元素这个位置就有两种情况
给你两个字符串,让你求一个最短字符串,其中存在给出串的种类;
求这个字符串的长度和种类;
思路:
//dp[i,j,k]表示前i个字符,包含s1串前j个字母,包含s2串前k个字符时的方案数。
//按照一定的顺序,碰到相同元素只会留一个,不同元素这个位置就有两种情况
#include<cstdio>#include<math.h>#include<queue>#include<map>#include<string>#include<string.h>#include<iostream>#include<algorithm>using namespace std;typedef long long LL;const int INF=0x3f3f3f3f;const LL mod=1e9+7;const int N=50;char s1[N],s2[N];int len[N][N];LL dp[100][N][N];int LCS(){ int n,m; n=strlen(s1+1); m=strlen(s2+1); memset(len,0,sizeof(len)); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(s1[i]!=s2[j]) len[i][j]=max(len[i-1][j],len[i][j-1]); else len[i][j]=len[i-1][j-1]+1; } } return n+m-len[n][m];}LL solve(int length){ int n,m; n=strlen(s1+1); m=strlen(s2+1); memset(dp,0,sizeof(dp)); dp[0][0][0]=1; for(int i=1;i<=length;i++) { dp[i][0][i]=1; dp[i][i][0]=1; for(int j=1;j<=min(n,i);j++) { for(int k=1;k<=min(m,i);k++) { if(s1[j]==s2[k]) dp[i][j][k]=dp[i-1][j-1][k-1]; else dp[i][j][k]=dp[i-1][j-1][k]+dp[i-1][j][k-1]; } } } return dp[length][n][m];}int main(){ int T,cas=1; int ans1; LL ans2; scanf("%d",&T); while(T--) { scanf("%s%s",s1+1,s2+1); ans1=LCS(); ans2=solve(ans1); printf("Case %d: %d %lld\n",cas++,ans1,ans2); } return 0;}
0 0
- Lightoj1013【DP_LCS】
- [DP_LCS] UVA10723
- LightOJ1013---Love Calculator (dp)
- LightOJ1013-Love Calculator-dp
- ☆lightoj1013 Love Calculator 两种转移方程详解(LCS+方案数DP)
- 思科路由器的启动过程
- 第七天
- 欢迎使用CSDN-markdown编辑器
- WebStorm用PhantomJS运行JavaScript程序
- http://web.jobbole.com/86734/
- Lightoj1013【DP_LCS】
- JAVA基础语法
- sql 书写case
- 使用eclipse关联jdk的源码
- stamp 邮票设计 搜索02
- Jmeter使用CSV Data Set Config参数化数据不重复的多次循环执行(实现多用户多次抽奖功能)
- java数据类型
- 20161017
- CodeForces 731