UVA 10069 Distinct Subsequences(dp+高精度加法)
来源:互联网 发布:修改图片尺寸的软件 编辑:程序博客网 时间:2024/06/14 11:34
题意:
给定2个字符串a, b,求b在a中出现的次数。
要求可以是不连续的,但是b在a中的顺序必须和b以前的一致。
思路:
类似于数字分解的题目。
dp[i][j]表示:
b的前j个字符在a的前i个字符中出现的次数。
dp[i][j] = dp[i][j-1];
if(b[i] == a[j])
dp[i][j] += dp[i-1][j-1];
母串:babgbag 状态中前 j 个字符组成的字串
字串:bag 状态中前 i 个字母组成的字串
为什么这样可以呢:因为前 i 个字串在前 j 个母串中出现的次数必然大于在前j - 1个母串中出现的次数,因此dp[i][j] >= dp[i][j-1],如果a[j] != b[i] 则 dp[i][j] = dp[i][j-1]
如果相等,还要在此基础上加上前 j - 1 时存在的 i - 1的字串出现的次数(因为这个次数要与现在相等的这个字符重新组合),由此if(b[i] == a[j]) dp[i][j] += dp[i-1][j-1];
给定2个字符串a, b,求b在a中出现的次数。
要求可以是不连续的,但是b在a中的顺序必须和b以前的一致。
思路:
类似于数字分解的题目。
dp[i][j]表示:
b的前j个字符在a的前i个字符中出现的次数。
dp[i][j] = dp[i][j-1];
if(b[i] == a[j])
dp[i][j] += dp[i-1][j-1];
母串:babgbag 状态中前 j 个字符组成的字串
字串:bag 状态中前 i 个字母组成的字串
为什么这样可以呢:因为前 i 个字串在前 j 个母串中出现的次数必然大于在前j - 1个母串中出现的次数,因此dp[i][j] >= dp[i][j-1],如果a[j] != b[i] 则 dp[i][j] = dp[i][j-1]
如果相等,还要在此基础上加上前 j - 1 时存在的 i - 1的字串出现的次数(因为这个次数要与现在相等的这个字符重新组合),由此if(b[i] == a[j]) dp[i][j] += dp[i-1][j-1];
注意:最后的结果可能高达 2^100 所以要用到高精度加法。
#include <cstdio>#include <cstring>#define MAXN 9999 #define MAXSIZE 10 #define DLEN 4 typedef long long ll;using namespace std;class BigNum { private: int a[100]; //可以控制大数的位数 int len; //大数长度 public: BigNum(){ len = 1; memset(a,0,sizeof(a)); }//构造函数 BigNum(const BigNum &); //拷贝构造函数 BigNum(const ll); BigNum &operator=(const BigNum &);BigNum operator+(const BigNum &) const;void print(); //输出大数 };BigNum::BigNum(const BigNum & T) : len(T.len) //拷贝构造函数 { int i; memset(a,0,sizeof(a)); for(i = 0 ; i < len; i++) a[i] = T.a[i]; }BigNum::BigNum(const ll b) {//将一个int类型的变量转化为大数 ll c,d = b;len = 0; memset(a,0,sizeof(a)); while(d > MAXN) { c = d - (d / (MAXN + 1)) * (MAXN + 1); d = d / (MAXN + 1); a[len++] = c; } a[len++] = d; } BigNum & BigNum::operator=(const BigNum & n) {//重载赋值运算符,大数之间进行赋值运算 int i; len = n.len; memset(a,0,sizeof(a)); for(i = 0 ; i < len ; i++) a[i] = n.a[i]; return *this; }BigNum BigNum::operator+(const BigNum & T) const //两个大数之间的相加运算 {BigNum t(*this); int i,big; //位数 big = T.len > len ? T.len : len; for(i = 0 ; i < big ; i++) { t.a[i] +=T.a[i]; if(t.a[i] > MAXN) { t.a[i + 1]++; t.a[i] -=MAXN+1; } } if(t.a[big] != 0) t.len = big + 1; else t.len = big; return t; }void BigNum::print() { int i; printf("%d", a[len-1]); for (int i = len-2; i >= 0; --i) { printf("%04d", a[i]); } }char s1[10005];char s2[105];BigNum dp[105][10005];int main() {int T;int len1,len2;scanf("%d",&T);while(T--) {scanf("%s",s1);scanf("%s",s2);len1 = strlen(s1);len2 = strlen(s2);for(int j = 0; j <= len1; j++) {dp[0][j] = BigNum(1);}for(int i = 1; i <= len2; i++) {dp[i][0] = BigNum(0);for(int j = 1; j <= len1; j++) {dp[i][j] = dp[i][j-1];if(s1[j-1] == s2[i-1]) {dp[i][j] = dp[i][j] + dp[i-1][j-1];}}}dp[len2][len1].print();printf("\n");}return 0;}
0 0
- UVA 10069 Distinct Subsequences(dp+高精度加法)
- uva 10069 Distinct Subsequences(dp,大数加法)
- dp+高精度 uva-10069-Distinct Subsequences
- UVA 10069 Distinct Subsequences(dp + 高精度)
- Distinct Subsequences - UVa 10069 dp+高精度
- UVa 10069 Distinct Subsequences(大数+DP)
- UVa 10069 Distinct Subsequences(大数 DP)
- uva 10069 Distinct Subsequences (dp + 大数)
- uva 10069 Distinct Subsequences(高精度 + DP求解子串个数)
- Uva-10069 Distinct Subsequences DP
- UVA 10069 Distinct Subsequences(DP)
- uva 10069 - Distinct Subsequences(大数相加+DP)
- uva 10069 Distinct Subsequences(DP + 大数相加)
- uva 10069 Distinct Subsequences 【dp+大数】
- UVA 10069 ---Distinct Subsequences +DP+大数
- 10069 - Distinct Subsequences(高精度+动态规划)
- Distinct Subsequences+uva+经典dp
- uva 10069 Distinct Subsequences
- 12306泄露查询 如何写一个像btgoogle一样的12306泄露数据查询
- 求1!+2!+3!+4!+……+10!
- 实体键和虚拟键不同的menu显示方式
- ExtJs 入门教程八[数字字段:NumberField、隐藏字段Hidden、日期字段:DataFiedl]
- Windows Socket编程
- UVA 10069 Distinct Subsequences(dp+高精度加法)
- UVA 796 - Critical Links (求桥按序输出)
- Java常见问题及答案
- MVC三层模(struts+spring+hibernate(SSH)总结
- 发现的一些在线地图库
- 关于FizzBuzz问题
- 蓝桥杯试题集 基础练习 数列排序
- pycharm+django搭建简单blog
- win7下IIS的安装和配置 图文教程