I love you
题目描述
此时相望不相闻,愿逐月华流照君。
一纸情书,到底蕴含了多少倍的爱情呢?
I love you, not only for what you are, but for what I am when I am with you.
输入描述:
共一行:一封若干个字符的情书(大小写不敏感)。
情书不会超过684594个字符(大写、小写字母)。
输出描述:
共一行:包含一个整数,即iloveyou在情书中作为子序列出现的次数。
由于答案可能很大,请输出对20010905取模后的值。
一道线性dp题;
dp[i][j]表示第i个字母匹配到了前j个字母的种类数;
状态转移方程:dp[i][j]=dp[i-1][j]+(s[i]==‘目标字符’)*dp[i-1][j-1];
最近写dp一点感觉都没有,可能是很久没写了吧;
#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,int>
#define lson k<<1
#define rson k<<1|1
#define inf 0x3f3f3f3f
//ios::sync_with_stdio(false);
using namespace std;
const int N=200100;
const int M=1000100;
const LL mod=20010905;
LL dp[700000][10];
char s[700000];
int main(){
// ios::sync_with_stdio(false);
scanf("%s",s+1);
for(int i=1;s[i]!='\0';i++){
dp[i][1]=(dp[i-1][1]+(s[i]=='I'||s[i]=='i'))%mod;
dp[i][2]=(dp[i-1][2]+(s[i]=='l'||s[i]=='L')*dp[i-1][1])%mod;
dp[i][3]=(dp[i-1][3]+(s[i]=='o'||s[i]=='O')*dp[i-1][2])%mod;
dp[i][4]=(dp[i-1][4]+(s[i]=='v'||s[i]=='V')*dp[i-1][3])%mod;
dp[i][5]=(dp[i-1][5]+(s[i]=='e'||s[i]=='E')*dp[i-1][4])%mod;
dp[i][6]=(dp[i-1][6]+(s[i]=='y'||s[i]=='Y')*dp[i-1][5])%mod;
dp[i][7]=(dp[i-1][7]+(s[i]=='o'||s[i]=='O')*dp[i-1][6])%mod;
dp[i][8]=(dp[i-1][8]+(s[i]=='u'||s[i]=='U')*dp[i-1][7])%mod;
}
cout<<dp[strlen(s+1)][8]<<endl;
return 0;
}