题意:给一个字符串str1,再给你一个字符串 str2 问你 str1中字串等于 str2 中 子序列的总数。
解题思路:dp[i][j] 表示 以 str2[j] = str1[i] 结尾的种类数 dp[i][j] = sum[i-1][j] + 1 。
解题代码:
1 // File Name: 163a.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月22日 星期日 17时09分33秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 #define M 1000000007 26 using namespace std; 27 char str[2][5005]; 28 int dp[5005][5005]; 29 int mx[2][5005]; 30 int sum[2][5005]; 31 int num[5005]; 32 int n , m; 33 int main(){ 34 scanf("%s %s",&str[0][1],&str[1][1]); 35 n = strlen(&str[0][1]); 36 m = strlen(&str[1][1]); 37 int ans = 0 ; 38 for(int i = 1;i <= n;i ++) 39 { 40 for(int j = 1;j <= m ; j ++) 41 { 42 if(str[0][i] == str[1][j]) 43 { 44 dp[i][j] = sum[0][j-1] + 1; 45 } 46 sum[1][j] = (sum[1][j-1]+dp[i][j]) % M; 47 // printf("%d ",dp[i][j]); 48 } 49 //printf("\n"); 50 ans = (ans + sum[1][m])%M; 51 memcpy(sum[0],sum[1],sizeof(sum[0])); 52 memset(sum[1],0,sizeof(sum[1])); 53 } 54 printf("%d\n",ans); 55 return 0; 56 }
没有梦想,何谈远方