(思维)(dp)【题解】CF909C Python Indentation

该博客探讨了一种简化Python代码子集中的缩进规则,分析了如何在给定的简单语句和for语句序列中形成有效代码的方案数。通过转移矩阵和优化策略,博主提供了解决方案并统计了不同缩进组合的数量。
摘要由CSDN通过智能技术生成

题目

  • 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 1N5000

题解

思路

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值