CF909C 【Python Indentation】

博客围绕一道动态规划(DP)题展开。作者起初看错题意,后发现是DP题。题解部分分析了状态,用dp[i][j]表示第i行j个缩进的总方案数,还阐述了两种情况下的状态转移,最后给出代码思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

这道题开始将题意看错了,将它打成了一道思维题,事后才发现这是一道DP。果然还是我太菜了

题解:

1.状态:

dp[i][j]dp[i][j]dp[i][j]表示第iii行j个缩进的总方案数。

2.状态转移:

(1) 当前一行为fff

这时由题意得这一行必须在上一行的基础上缩进一格(且只能为一格)
所以dp[i][j]=dp[i−1][j−1];dp[i][j] = dp[i - 1][j - 1];dp[i][j]=dp[i1][j1];

(2)当前一行为sss

这时我们可以任意缩进,但是要注意因为上一格是sss所以这一行不能缩进,即若这一行为i,上一行只能在i~n中取值。所以我们可以用一个倒叙循环对每一次的个数累加。

代码:

#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN = 5005, mod = 1e9 + 7;
long long dp[MAXN][MAXN], n;
char a[MAXN];
int main() {
    scanf("%lld", &n);
    for (int i = 1; i <= n; i++) cin>>a[i];
    dp[1][0] = 1;
    for (int i = 2; i <= n; i++) {
        if (a[i - 1] == 'f') {
            for (int j = 1; j <= i; j++) dp[i][j] = dp[i - 1][j - 1];
        } else {
            long long sum = 0;
            for (int j = i; j >= 0; j--) {
                sum = (sum + dp[i - 1][j]) % mod;
                dp[i][j] = sum;
            }
        }
    }
    long long zsum = 0;
    for (int i = 0; i <= n; i++) zsum = (zsum + dp[n][i]) % mod;
    printf("%lld", zsum);
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值