C. String Game ###K ###K ###K //K
题目链接:https://codeforces.ml/gym/308590/submit
题意:给定字符串A 和字符串B 问B在A中子序列的出现次数
思路: 计数dp dp[i][j] 代表A串前i个中 出现B串的前j个数 每次dp[i][j]=dp[i-1][j]继承过来
当a[i]==b[j]的时候 dp[i][j]+=dp[i-1][j-1] 所有的 dp[i][0]=1 因为是合法情况
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define pb push_back 4 using namespace std; 5 const int maxn=1e3+10; 6 const int mod=1e9+7; 7 int dp[maxn*5][maxn]; 8 9 10 int main() 11 { 12 ios::sync_with_stdio(0); 13 cin.tie(0); 14 string a,b; 15 while(cin>>a>>b) 16 { 17 memset(dp,0,sizeof(dp)); 18 int n=a.size(),m=b.size(); 19 for(int i=1;i<=n;i++) 20 { 21 for(int j=1;j<=m;j++) 22 { 23 dp[i][j]=dp[i-1][j]; 24 if(a[i-1]==b[j-1]) 25 { 26 if(j==1) 27 dp[i][j]++; 28 else 29 dp[i][j]+=dp[i-1][j-1]; 30 } 31 dp[i][j]%=mod; 32 } 33 } 34 cout<<dp[n][m]<<'\n'; 35 } 36 37 38 39 40 }
看似子串中麻烦的需要去重的 其实dp可以解决
类似的题目 https://ac.nowcoder.com/acm/contest/9981/A
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e6+10; 4 const int mod=1e9+7; 5 #define ll long long 6 #define pi pair<int,int> 7 #define fi first 8 #define sc second 9 #define pb push_back 10 11 ll dp[maxn][3]; 12 13 14 int main() 15 { 16 ios::sync_with_stdio(0); 17 cin.tie(0); 18 dp[1][0]=25; 19 dp[1][1]=1; 20 int n; 21 cin>>n; 22 ll ans=0; 23 for(int i=2;i<=n;i++) 24 { 25 dp[i][0]=dp[i-1][0]*25%mod; 26 dp[i][1]=dp[i-1][0]+dp[i-1][1]*25%mod; 27 dp[i][1]%=mod; 28 dp[i][2]=dp[i-1][1]+dp[i-1][2]*26; 29 dp[i][2]%=mod; 30 ans+=dp[i][2]; 31 ans%=mod; 32 } 33 cout<<ans<<'\n'; 34 35 36 37 38 }
dp[i][0/1/2] 长度为i的串中 出现j个 子串us 的 方案数

浙公网安备 33010602011771号