codeforces 1084C The Fair Nut and String (dp)
题目链接:https://codeforces.com/problemset/problem/1084/C
思想:对于元素不连续的序列统计方案,可以考虑每个元素的贡献,用之前的答案与当前元素组合来求解
统计出每组 a 的个数,转换成如下问题:
给定 n 个数,求 n 个数组合的乘积之和
做法:
对于每个数,考虑该数对之前所有数的贡献,之前的数的答案乘上这个数(选这个数和之前的数的答案),之前的数的方案数(不选这个数的答案),
(该数数量)只选这个数的答案,相加,就是前 i 个数的答案
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<stack>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn = 100010;
const int mod = 1000000007;
int n;
int c[maxn],dp[maxn];
char s[maxn];
ll read(){ ll s=0,f=1; char ch=getchar(); while(ch<'0' || ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0' && ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*f; }
int main(){
scanf("%s",s);
n = strlen(s);
int cnt = 1;
for(int i=0;i<n;++i){
if(s[i] == 'a') ++c[cnt];
if(s[i] == 'b'){
if(c[cnt]) ++cnt;
}
}
dp[1] = c[1];
for(int i=2;i<=cnt;++i){
dp[i] = (1ll * dp[i-1] * c[i] + dp[i-1] + c[i]) %mod;
}
printf("%d\n",dp[cnt]);
return 0;
}