传送门:I love you
题意:给出一个文本串,求包含子序列(可以不连续)"iloveyou"的个数
dp[i][j]表示子串0—i-1,文本0—j的情况下文本串中有子序列的个数。
先考虑s再考虑t
状态转移方程:
当s[i-1] !=t[j-1]时,dp[i][j]=dp[i-1][j];当前0—i-1与0—j-1和0—i-2与0—j-1的一样
当s[i-1]==t[j-1]时,dp[i][j]=dp[i-1][j-1]+dp[i-1][j];当前情况产生了新的可能,这些可能由dp[i-1][j-1]延续,以及加上dp[i-1][j]。
#include<bits/stdc++.h>
using namespace std;
const int mod=20010905;
string S,T;
int dp[1084594][10];
int solve() {
int ss=S.size()+1;
int st=T.size()+1;
dp[0][0]=1;
for(int i=1;i<ss;++i) {
dp[i][0]=1;
}
for(int i=1;i<ss;++i){
for(int j=1;j<=i&&j<st;++j){
if(S[i-1]==T[j-1]){
dp[i][j]=(dp[i-1][j-1]+dp[i-1][j])%mod;
}else{
dp[i][j]=dp[i-1][j];
}
}
}
return dp[ss-1][st-1];
}
int main(){
cin>>S;
transform(S.begin(),S.end(),S.begin(),::tolower);
T="iloveyou";
cout<<solve()<<endl;
return 0;
}
来源:CSDN
作者:jjl0229
链接:https://blog.csdn.net/weixin_43769146/article/details/104060556