题目
-
Python的代码中不需要写begin、end或者大括号去标记开头或结尾。 我们将考虑一种Python非常简化的子集,它的语句只有两种类型。 每行只写一个简单语句,比如赋值。 For语句是一个较复杂的语句,他们可能包含一个或多个其他的语句。 For语句由一个单独的行组成,以“For”前缀和循环体开头。 循环体是一个语句块,比循环头缩进一级。 循环体可以包含这两种类型的语句。循环体不能为空。 给你一个没有缩进的序列,求有多少种方式添加缩进可以形成一个完整的Python代码。 输入格式: 第一行:N 接下来N行每行一个字符f(for语句)或s(简单语句)。 保证最后一行一定是s(简单语句)。 输出格式: 输出方案数,答案对10^9+7取模。
-
1 ≤ N ≤ 5000 1 \leq N \leq 5000 1≤N≤5000
题解
思路
dp[i][j]
表示前 i
行语句,且第 i
行语句前面有 j
个缩进时的总方案数
转移时,需要按前一行语句来进行分类
前一行为 f
当前一行为 f
时,很明显,这一行必须在前一行的基础上再加一个缩进,并且有且仅有这一种方法,所以枚举这一行的缩进个数,通过前一行来转移这一行即可
另外,这一行的缩进数最多也就是当前 f
的总个数(每个 f
都缩进),所以循环时就不用每次都从很大开始枚举
if(a[i-1]=='f'){
fcnt++;
for(int j=1;j<=fcnt;j++){
dp[i][j]=dp[i-1][j-1];
dp[i][j]%=MOD;
}
}
前一行为 s
由于我们保证了合法,所以前一行为 s
时就可以理解为前面已经形成了一个完整的代码块,具体如下
在这张图中,我们发现在第 7 7