牛客小白月赛21 I I love you(dp的优化)

题目链接

题目描述

此时相望不相闻,愿逐月华流照君。

一纸情书,到底蕴含了多少倍的爱情呢?

I love you, not only for what you are, but for what I am when I am with you.

输入描述:

共一行:一封若干个字符的情书(大小写不敏感)。
情书不会超过684594个字符(大写、小写字母)。

输出描述:

共一行:包含一个整数,即iloveyou在情书中作为子序列出现的次数。
由于答案可能很大,请输出对20010905取模后的值。

示例1

输入

IloveyouNotonlyforwhatyouareButforwhatIamWhenIamwithyouIloveyouNotonlyforwhatYouhavemadeofyourselfButforwhatYouaremakingofme

输出

2864

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int mod=20010905;
int dp[8];
int main()
{
	string str;
	cin>>str;
	for(int i=0;i<str.size();i++)
	{
		str[i]=tolower(str[i]);
		
		if(str[i]=='i')dp[0]++;
		
		if(str[i]=='l')dp[1]=(dp[1]+dp[0])%mod;
		
		if(str[i]=='o')dp[2]=(dp[1]+dp[2])%mod;
		
		if(str[i]=='v')dp[3]=(dp[3]+dp[2])%mod;
		
		if(str[i]=='e')dp[4]=(dp[4]+dp[3])%mod;
		
		if(str[i]=='y')dp[5]=(dp[5]+dp[4])%mod;
		
		if(str[i]=='o')dp[6]=(dp[6]+dp[5])%mod;
		
		if(str[i]=='u')dp[7]=(dp[7]+dp[6])%mod;
		
	}
	cout<<dp[7]<<endl;
 } 

思路这道题跟我前面发的CF上的一道题很相似,让求i love you这段字符串出现的次数,可以不是连续的,dp[0]算的是I的个数,dp[1]是 L的个数,实际上算的是I L出现的次数,但是为啥打dp[1]等于dp[1]加上dp[0]的个数呢,比方说前面已经出现过n次I,后面每出现一次L,也就是IL的次数就会加n。后面依次向后推,dp[7]就是整个字符串出现的次数。很巧妙!Orz。

  • 11
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值