uva10069

来源:互联网 发布:mac os 升级老版本 编辑:程序博客网 时间:2024/05/19 12:12

题目的意思很简单,就是问在第一串中取子串与  第二串一样.有几种..

dp的思路很简单,就是如果第一串中的第 i 位 ,与 第二串中的第 j 位相等.则f[i][j] = f[i][ j - 1] + f[i - 1][j  - 1]    否则f[i][j] = f[i][j - 1]   .

但是这个数据太大了,所以要用高精度...因为懒得写大数相加.直接套了模板上去了...


AC代码:


#include<stdio.h>#include<string.h>using namespace std;const int N = 10005;const int M = 105;void Add(char *c, char *a, char *b)  {      int len_a = strlen(a);      int len_b = strlen(b);  int len_c = len_a > len_b ? len_a : len_b;  memset(c, 0, (len_c+2)*sizeof(c[0]));  for(int i=len_a-1, j=len_c; i>=0; --i, --j)  c[j] += a[i] - '0';  for(int i=len_b-1, j=len_c; i>=0; --i, --j)  c[j] += b[i] - '0';  for(int i=len_c; i>0; c[i]+='0', --i)  if(c[i] > 9)  {  c[i] -= 10;  ++c[i-1];  }  if(!c[0]){  for(int i=0; i<len_c; ++i)  c[i] = c[i+1];  c[len_c] = 0;  }  else  c[0] = '1';  }  char str1[N];char str2[M];char f[M][N][102];int main () {int t;scanf("%d",&t);getchar();while(t--) {scanf("%s%s",str1,str2);int len1 = strlen(str1);int len2 = strlen(str2);for (int i = 0 ;i <= len1 ;i++) {strcpy(f[0][i] ,"1" );}for (int i = 1 ; i <= len2  ;i++) {for (int j = i ; j <= len1 ;j++) {strcpy(f[i][j], f[i][j-1]);if(str1[j] == str2[i]) {Add (f[i][j] , f[i][j - 1] ,f[i - 1][j - 1]) ;}}}printf("%s",f[len2][len1]);printf("\n");}}


0 0