uva10069(DP + 高精度运算)
来源:互联网 发布:自学加工中心编程入门 编辑:程序博客网 时间:2024/05/06 21:05
题目大意:
给出A,B两个串,问A串中有多少个B串
思路:
因为A串可以达到非常大,所以需要用到大数相加。
dp[i][j]表示B中前i个字符在j中的前j个字符中有几个
当i和j是一样的情况下,dp[i][j]等于B的前i个字符在A的前j-1个字符中的个数加上B的前i - 1个字符在A的前j - 1个字符中的个数
dp[i][j] = dp[i][j - 1] + dp[i - 1][ j - 1]
当i和j不一样的情况下,
dp[i][j] = dp[i][j - 1]
代码:
#include <iostream>using namespace std;#include <cstring>#include <stdio.h>char s1[10002],s2[105];char dp[101][10001][102];void add(char * a,char * b,char * c) { int len1 = strlen(b); int len2 = strlen(c); int len3 = max(len1,len2); memset(a,0,(len3 + 5) * sizeof(a[0])); for(int i = len1 - 1,j = len3;i >= 0;i--,j--) a[j] += b[i] - '0'; for(int i = len2 - 1, j = len3; i >= 0; i--,j--) a[j] += c[i] - '0'; for(int i = len3; i >0 ; a[i] +='0',i--) if(a[i] > 9) { a[i] -= 10; a[i - 1]++; } if(!a[0]) { for(int i = 0; i < len3; i++) a[i] = a[i + 1]; a[len3] = 0; } else a[0] = '1';}int main() { int T; scanf("%d",&T); while(T--) { gets(s1); gets(s2); int len1 = strlen(s1); int len2 = strlen(s2); for(int i = 0; i <= len1; i++) strcpy(dp[0][i],"1"); for(int i = 1; i <= len2; i++) { strcpy(dp[i][i - 1],"0"); for(int j = i; j <= len1; j++) { if(s1[j - 1] == s2[i - 1]) add(dp[i][j],dp[i - 1][j - 1],dp[i][j - 1]); else strcpy(dp[i][j],dp[i][j - 1]); } } printf("%s\n",dp[len2][len1]); } return 0;}
0 0
- uva10069(DP + 高精度运算)
- uva10069(DP+大数)
- uva10069
- uva10069
- UVA10069 Distinct Subsequences 超级大数 + DP
- uva10069 - Distinct Subsequences(大数+DP)
- hdu 1502 字符串dp与高精度运算(mark)
- 高精度运算
- 高精度运算
- 高精度运算
- 【高精度运算】
- 高精度运算
- 高精度运算
- 高精度运算
- 高精度运算
- 高精度运算
- 高精度运算。
- 高精度运算
- C++:编写一个程序,用动态分布分配空间的方法计算Fibonacci数列的前二十项并存储到动态分布的空间中
- iOS架构谈
- Java片段 Java中Double和Long互相转换
- /usr/bin/ld:cannot find -lIN
- HTML常用标签
- uva10069(DP + 高精度运算)
- HDU 3199Hamming Problem
- Window和DecorView
- 堆 栈
- vim ctags使用方法
- Java字符串的比较是否相同
- Vmware-NAT网络模式介绍及理解
- svn服务器搭建和使用:Custom action GenerateSSLKey failed: Command terminated with non-zero exit code
- 重启PHP