UVA 10723
来源:互联网 发布:英文写作润色软件 编辑:程序博客网 时间:2024/05/18 03:23
题目大意是给你两个字符串,求一个最短长度的字符串,使得两个字符串是这个字符串的子序列,同时求出有多少种这样的字符串。
思路
LCS
其实求出最短长度还是很好理解是一个基本的LCS问题。但是求出多少种就要用递推。
设p(i, j)是第一个字符串的前i个字符和第二个字符串的前j个字符串求得的最短长度字符串的数量。
设d(i, j)是最长公共子序列长度, s, t分别为两个字符串。
当s[i] == t[j] 很明显 p[i][j] = p[i - 1][j - 1]
当s[i] != t[j] 一、当d[i - 1][j] > d[i][j - 1] 说明前一种状态在到达d(i, j)的长度最优,是我们要求得答案
二、当d[i - 1][j] < d[i][j - 1] 和一类似
三、当d[i - 1][j] == d[i][j - 1]时,说明两种状态都可以够成最优,方法肯定是两种的都可以,便加在一起。
#include <bits/stdc++.h>using namespace std;const int maxn = 30 + 10;typedef long long LL;int d[maxn][maxn], n;LL p[maxn][maxn];char s[maxn], t[maxn];int main(){ int kase = 0; int T; scanf("%d", &T); getchar(); while(T --) { gets(s + 1); gets(t + 1); memset(d, 0, sizeof(d)); memset(p, 0, sizeof(p)); int n = strlen(s + 1); int m = strlen(t + 1); for(int i = 0; i <= n; ++i) p[i][0] = 1; for(int j = 0; j <= m; ++j) p[0][j] = 1; for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) if(s[i]==t[j]) { d[i][j] = d[i - 1][j - 1] + 1; p[i][j] = p[i - 1][j - 1]; }else{ d[i][j] = max(d[i][j - 1], d[i - 1][j]); if(d[i][j - 1] > d[i - 1][j]) { p[i][j] = p[i][j - 1]; }else if(d[i - 1][j] > d[i][j - 1]) { p[i][j] = p[i - 1][j]; }else{ p[i][j] = p[i - 1][j] + p[i][j - 1]; } } printf("Case #%d: %d %d\n",++kase, n + m - d[n][m], p[n][m]); } return 0;}
0 0
- UVA 10723
- uva 10723 Cyborg Genes
- UVA 10723 Cyborg Genes
- UVA 10723 Cyborg Genes
- uva 10723 Cyborg Genes
- UVA - 10723 Cyborg Genes
- UVa 10723 - Cyborg Genes
- uva 10723 - Cyborg Genes
- uva 10723(dp)
- UVa 10723 Cyborg Genes
- UVA - 10723 Cyborg Genes
- UVA 10723 Cyborg Genes
- UVA 10723 Cyborg Genes
- UVA 10723 LCS
- uva 10723 Cyborg Genes
- uva
- UVA
- UVA
- 找工作之Effective C++
- 状态压缩
- WEEX|初始化工程
- GObject 学习笔记汇总---7
- clang static analyzer源码分析(番外篇):RegionStore以及evalCall()中的conservativeEvalCall
- UVA 10723
- SAP HANA Smart Data Access 远程连接HANA\ORACLE 转载有修改
- 2016CCPC合肥赛区总结(流水账)
- 程序员的自我修养-运行库
- 一个自定义的 View,支持显示下载进度,完成和结束的时候会有酷酷的动画。
- 如何获取radio的值
- 检查磁盘空间的CentOS常用命令
- HTML第六章上机练习3
- PowerDesigner使用教程|使用方法