码迷,mamicode.com
首页 > 编程语言 > 详细

CF909C 【Python Indentation】

时间:2021-06-10 17:47:06      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:can   mes   line   循环   ons   这一   clu   lan   ==   

前言:

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

题解:

1.状态:

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

2.状态转移:

(1) 当前一行为\(f\)

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

(2)当前一行为\(s\)

这时我们可以任意缩进,但是要注意因为上一格是\(s\)所以这一行不能缩进,即若这一行为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;
}

CF909C 【Python Indentation】

标签:can   mes   line   循环   ons   这一   clu   lan   ==   

原文地址:https://www.cnblogs.com/cqbzlipengcheng/p/14868224.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!