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
原创粉丝点击