根据题目,又是求方案数的题目,先找到联系,熟悉规则;
看数据就猜是二维DP,题目分为不同字符 'f', 's'.
‘f’根据规则需要缩进一格,‘s’就是简单的输出一行。
所以根据题意:往前一格想,就设思想为:在第i格时有几格缩进的方案数,用f[i, j]表示。
当第i - 1格是‘f’时, 没办法只能缩进一格所以表示为:f[i][j] = f[i - 1][j - 1];
当第i - 1格是‘s'时, 代表第i个可以放在比第i - 1格的缩进少的缩进,这里需要一个for
状态: f[i][j] = f[i - 1][j] + f[i - 1][j - 1] + ··· + f[i - 1][1]的值。三层for必爆,可以优化下这里, 具体看代码。
void solve()
{
int n;
cin >> n;
for (int i = 1; i <= n; i ++) cin >> a[i];
f[1][0] = 1;
for (int i = 2; i <= n; i ++)
{
if (a[i - 1] == 'f')
{
for (int j = 1; j <= i; j ++) f[i][j] = f[i - 1][j - 1], f[i][j] %= mod;
}
else
{
int sum = 0;
for (int j = i; j >= 0; j --)
{
sum += f[i - 1][j], sum %= mod;
f[i][j] = sum, f[i][j] %= mod;
}
}
}
int ans = 0;
for (int i = 0; i < n; i ++) ans += f[n][i], ans %= mod;
cout << ans << '\n';
}