C. Python Indentation CF909C--(dp)

发布时间 2023-04-21 18:14:55作者: N再再

根据题目,又是求方案数的题目,先找到联系,熟悉规则;


看数据就猜是二维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';
}