题目描述
小红拿到了一个仅由数字字符组成的字符串。她准备选择一个非空子序列,使得该子序列中不包含连续的"61"子串。
小红想知道,有多少种不同的子序列选择方式?答案对1e9+7
取模。
输入描述:
一个仅由数字组成的字符串,长度不超过10^5
输出描述:
满足题目条件的子序列数量。
示例1
输入
12
输出
3
说明
有3个非空子序列,均符合条件。
示例2
输入
654321
输出
62
题意
在字符串str中找出不含"61"的子序列的个数
思路
一个字符也算是子序列,所以f的初始值为1,f用来表示目前能够构成的所有子序列的个数
sum用来表示含'6'的子序列的个数
代码
#include <iostream>
using namespace std;
const int MOD = 1e9+7;
const int N = 1e5+10;
int dp[N];
int main()
{
string str;
cin >> str;
str = " " + str;
int f = 1,sum = 0;
for(int i = 1;i < str.length();i ++)
{
if(str[i] == '1') //如果出现字符1的话,需要将现有的所有的子序列的数量-含'6'的子序列的数量
dp[i] = (f - sum + MOD)%MOD;
else
dp[i] = f;
if(str[i] == '6')
sum = (sum + dp[i]) % MOD;
f = (f + dp[i]) % MOD;
}
int ans = 0;
for(int i = 1;i < str.length();i ++)
ans = (ans + dp[i]) % MOD;
cout << ans << endl;
return 0;
}
标签:int,小红过,sum,61,str,序列,dp,MOD
From: https://www.cnblogs.com/heystar/p/17450286.html