Python缩进
Python缩进
在 Python 中,代码块没有显式的开始/结束或大括号来标记代码块的开始和结束。
相反,代码块是通过缩进定义的。
我们考虑一个极其简化的 Python 子集,其只有两种类型的语句:简单语句和 语句。
- 简单语句(
Simple statements
)仅占一行,每行一个。 - 语句(
For statements
)是复合语句:它们包含一个或多个其它语句。 语句由循环头和循环体共同组成。循环头是一个以 开头的单独行。循环体是比循环头缩进一级的语句块。循环体可以包含两种类型的语句。循环体不能为空。
给定 个没有缩进的语句,请你计算,通过合理缩进,一共可以形成多少个不同的有效 Python 代码。
输入格式
第一行包含整数 。
接下来 行,每行包含一个字符 f
(表示 语句)或 s
(表示简单语句),用来描述一行给定语句的类型。
保证最后一行一定是简单语句。
输出格式
一个整数,表示可以形成的不同有效 Python 代码的数量对 取模后的结果。
数据范围
前 个测试点满足 。
所有测试点满足 。
输入样例1:
4
s
f
f
s
输出样例1:
1
样例1解释
可以形成一种有效代码:
simple statement
for statement
for statement
simple statement
输入样例2:
4
f
s
f
s
输出样例2:
2
样例2解释
可以形成以下两种有效代码:
for statement
simple statement
for statement
simple statement
或
for statement
simple statement
for statement
simple statement
解题思路
先来条喜讯,最后保研去了 985 的 CS,结果还是比较满意的了,唯一遗憾的地方就是没做 TCS 的方向。所以之后的时间就会相对轻松许多,不过之前因为忙着推免的事导致半个多月没碰过算法,现在算是又回坑了吧。虽然半个月没碰了,但感觉退步了好多,比如这道题我都不会做()。之后的计划还是每天会抽些时间写算法题和博客,同时优化一下博客的编写规范,并尝试写一些 AtCoder 和牛客上面的题解等。
这题关键的地方是上一条语句能决定当前语句能缩进的的级别。比如当前有如下的程序:
s ...
for ...
s ...
for ...
s ...
可以发现上一条语句是 语句,那么无论当前是 语句还是 语句,都可以缩进到不超过上一条语句级别的任意级别:
s ...
f ...
s ...
f ...
s ...
s/f ...
s ...
f ...
s ...
f ...
s ...
s/f ...
s ...
f ...
s ...
f ...
s ...
s/f ...
而如果上一条语句是 语句,那么无论当前是 语句还是 语句,都只能缩进到上一条 语句的下一个级别。比如:
s ...
f ...
s ...
f ...
f ...
s/f ...
因此定义状态 表示由前 条语句构成,且第 条语句缩进了 级的所有方案的数量。根据第 条是 语句还是 语句来进行状态划分。
如果第 条语句是 语句,那么第 条语句只能缩进到上一条语句的下一个级别(由于第 条语句是第 级,因此上一条语句就是第 级),因此状态转移方程是 。
如果第 条语句是 语句,那么可以缩进到不超过第 条语句级别的任意级别。由于第 条语句的级别是 ,因此第 条语句的级别要大于等于 ,即可以是 。因此状态转移方程就是 。很明显需要对这个状态转移方程进行优化,可以发现由于 ,因此有 。实现的时候只需倒着枚举 ,这样要计算 时, 已经算出来了。
那么最终的答案就是 。
AC 代码如下,时间复杂度为 :
#include <bits/stdc++.h>
using namespace std;
const int N = 5010, mod = 1e9 + 7;
char s[N];
int f[N][N];
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%s", s + i);
}
f[1][1] = 1;
for (int i = 2; i <= n; i++) {
for (int j = i; j; j--) {
if (s[i - 1] == 'f') f[i][j] = f[i - 1][j - 1];
else f[i][j] = (f[i - 1][j] + f[i][j + 1]) % mod;
}
}
int ret = 0;
for (int i = 1; i <= n; i++) {
ret = (ret + f[n][i]) % mod;
}
printf("%d", ret);
return 0;
}
参考资料
AcWing 5268. Python缩进(AcWing杯 - 周赛):https://www.acwing.com/problem/content/5271/
本文来自博客园,作者:onlyblues,转载请注明原文链接:https://www.cnblogs.com/onlyblues/p/17744398.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
2022-10-06 Maximum Deletions on a String
2022-10-06 买糖果
2022-10-06 整数拆分