codeforces 909 C. Python Indentation

xenomai内核解析--嵌入式实时linux概述 Linux系统作为一个GPOS(通用操作系统)发展至今已经非常成熟可靠了,并且由于遵循GPL协议,开放所有系统源代码,非常易于裁剪。更重要的是,与其他开源的GPOS或RTOS相比,Linux系统支持多种处理器、开发板,提供多种软件开发工具,同时Linux系统对网络和图形界面的支持非常出色。显然,选择Linux操作系统在产品的开发周期和成本控制方面都有巨大优势。 虽然Linux系统功能强大、实用性强... 阅读详情

Description

In Python, code blocks don’t have explicit begin/end or curly braces to mark beginning and end of the block. Instead, code blocks are defined by indentation.

We will consider an extremely simplified subset of Python with only two types of statements.

Simple statements are written in a single line, one per line. An example of a simple statement is assignment.

For statements are compound statements: they contain one or several other statements. For statement consists of a header written in a separate line which starts with “for” prefix, and loop body. Loop body is a block of statements indented one level further than the header of the loop. Loop body can contain both types of statements. Loop body can’t be empty.

You are given a sequence of statements without indentation. Find the number of ways in which the statements can be indented to form a valid Python program.

Input

The first line contains a single integer N (1 ≤ N ≤ 5000) — the number of commands in the program. N lines of the program follow, each line describing a single command. Each command is either “f” (denoting “for statement”) or “s” (“simple statement”). It is guaranteed that the last line is a simple statement.

Output

Output one line containing an integer - the number of ways the given sequence of statements can be indented modulo 10 9  + 7.
Examples

Input
4
s
f
f
s
Output
1

Input
4
f
s
f
s
Output
2

Note

In the first test case, there is only one way to indent the program: the second for statement must be part of the body of the first one.

simple statement
for statement
  for statement
    simple statement

In the second test case, there are two ways to indent the program: the second for statement can either be part of the first one’s body or a separate statement following the first one.

for statement
  simple statement
  for statement
    simple statement

or

for statement
  simple statement
for statement
  simple statement


感谢下面的博主的倾情分享~

https://www.cnblogs.com/widsom/p/8136805.html
http://www.cnblogs.com/Leohh/p/8135525.html

题意:f代表for语句,它后面的语句至少有一句是它内部的,其他语句要么在内部要么在外部,s语句是普通语句。给一个没有缩进的f, s代码,求一共有多少种满足上述的缩进方案,结果模1e9+7。

分析:对每一行语句,其实只关心上一行语句的缩进是多少。为了更好的理解,可以先看一下暴力求所有方案的过程:
graph
如图,每一根红线表示一次搜索,最终一共有6+3+1种方案。可以发现,先后三次经过了(5, 0)到达(6, 0),先后2次经过(5, 1)分别到达(6, 0)和(6, 1),这些其实是完全相同的动作,可以利用动态规划避免这种重复的运算。其实就是记录了每个点被搜索的次数,然后把相同的搜索一次性转移到下一行上。假想把所有的搜索暂停在第5行,(5, 1)总共被搜索了两次,那么从它向下产生的搜索都是+2的。这样做,就把行与行直接转移的代价从接近斐波那契的复杂度降到了O(n^2)。这样的复杂度还是很高,但选择恰当的求和顺序最终可以降到O(n)。

思路:使用二维数组w[i][j]来记录第i行的字符在j缩进可以产生的搜索数

第i行是f,i+1行的状态更新:

w[i+1][j+1]+=w[i][j] 下一行一定是j+1缩进的
w[i+1][0~j] 不产生其他缩进

第i行是s,i+1行的状态更新:

w[i+1][j+1]+=w[i][j]
w[i+1][j]  +=w[i][j-1~j]
w[i+1][j-1]+=w[i][j-2~j]
...

看似需要O(n^2)才能求和,但注意到求和的个数在累加,所以其实可以采用从右往左的更新方式,这样只需要更新sum,一遍就能更新整行:

w[i+1][j+1]+=w[i][j] (->sum)
w[i+1][j]  +=w[i][j-1]+sum (->sum)
w[i+1][j-1]+=w[i][j-2]+sum (->sum)
...

终于把复杂度优化到O(n)了!代码虽然很短,但我看了一个下午才彻底理解其中的思想orz
需要注意的是,起始的时候w[0][0]的值应该设为1。

#include<stdio.h>
//#include<iostream>
//using std::cin;
//using std::cout;
#include<algorithm>
using std::sort;
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define mabs(x) ((x)>0?(x):(0-(x)))
#define N_max 5003

char ipt[N_max];
int n;
int w[N_max][N_max] = { 0 };
const int mod = 1000000007;
//非递归dp
void dp() {
    for (int i = 0; i < n-1; ++i) {
        if (ipt[i] == 'f')//来自f的增量
            for (int j = 0; j <= i; ++j)
            {
                w[i + 1][j + 1]=(w[i+1][j+1]+ w[i][j])%mod;
            }
        //来自s的增量
        else if (ipt[i] == 's'){
            int sum = 0;
            //从右往左更新
            for (int j = i; j >= 0; --j) {
                sum =(sum+ w[i][j])%mod;
                w[i + 1][j] =(w[i+1][j]+ sum)%mod;
            }

        }
    }
}
int main(){
    char etr;
    scanf("%d", &n);
    scanf("%c", &etr);
    for (int i = 0; i < n; ++i) {
        scanf("%c%c", &ipt[i], &etr);
    }
    //起始量
    w[0][0] = 1;
    dp();
    for (int t = 1; t < n; ++t) {//求和最后一行即是结果
        w[n - 1][0] =(w[n-1][0]+ w[n - 1][t])%mod;
    }
    printf("%d\n",w[n-1][0]);
}
2、瑞丽-伯纳德对流的拉格朗日拟序结构(FTLE场结果对比) 在中,我简单比较了瑞丽伯纳德对流的FTLE场,但是因为粒子追踪采用的是欧拉方法,所以精度不是很高, 因此与文献中的结果还是有些差别。下面放一张文献中的FTLE场,参数与上篇文章是一致的,Ra = 1e8;Pr = 1;本文将详细的介绍如何得到这样的图片,好吧,其实也不是很详细。总之,先展示以下我个人的结果。可以看出,上图基本上与文献是一致的,因为这里展示的是瞬时场,所以当然不可能是完全一致,至于提取的LCS结构,我在下面也会提及。本着详细介绍的原则,所以这里我很良心的从流场计算开始介绍。 阅读详情

相关推荐

Jetson Orin Nano@Ubuntu22.04:IMX219 CSI摄像头配置全流程与避坑指南

本文详细介绍了在Jetson Orin Nano@Ubuntu22.04系统上配置IMX219 CSI摄像头的全流程,包括硬件安装、驱动配置、常见问题排查及性能优化。特别强调了排线方向、驱动模式选择等关键细节,并提供了实用的命令和解决方案,帮助开发者高效完成摄像头部署与调试。

prometheus9mon的博客 318

C. Python Indentation(巧妙的状态设计)

传送门 现在真是越来越菜了啊 说实话开始肯定想到组合模拟,但是发现很难办说实话开始肯定想到组合模拟,但是发现很难办说实话开始肯定想到组合模拟,但是发现很难办 因为前面怎么缩进的都是不知道的因为前面怎么缩进的都是不知道的因为前面怎么缩进的都是不知道的 考虑动态规划,dp[i][j]表示在i语句缩进j次的答案考虑动态规划,dp[i][j]表示在i语句缩进j次的答案考虑动态规划,dp[i][j]表示在i语句缩进j次的答案 注意这里的缩进j次是指i语句缩进j次,不是总的缩进次数注意这里的缩进j次是指i语句缩进j次,

jziwjxjd的博客 451

实验四 基于IDEA+SpringBoot+Maven+Thymeleaf的系统实现实验目的

通过这次实验,我学习了如何成功进行IDEA+SpringBoot+maven的系统实现,搭建好IDEA+SpringBoot+maven的系统环境,成功地安装并配置了maven的运行环境,学会了创建springboot的三种方式,并且能将之前的实验结合起来运用。pom.xml中引入thymeleaf依赖,在classpath:/templates/下新建HTML页面(可采用实验一创建的页面),新建controller进行测试,访问页面后返回success成功数据。同时掌握和thymeleaf的基本语法。

m0_73502929的博客 1379

CF#445 C. Python Indentation

题目:http://codeforces.com/contest/909/problem/C 题意:给一系列循环(for)和基本语句(simple),求通过for的不同嵌套,能组成多少种不同的程序。 分析: 逆推DP; f[i][j] 表示:第i-n个字符组成的程序,且有j个独立语句的方案数; 其中独立语句意思是:未被for包含的s语句 或者 未被其他for包含的f语句; 用sum数组记

OI -> ACM -> AI 542

【R语言-生存分析之观察生存率计算】

全人群肿瘤登记资料常用的统计分析指标包括发病率、死亡率、现患率以及生存率等,其中肿瘤生存率是评估肿瘤治疗效果和肿瘤负担的必要指标,其计算涉及肿瘤患者的发病、 死亡和随访三个方面的资料, 数据整理和计算过程均较为复杂, 如何及时、 准确地计算肿瘤生存率, 并使其可以在不同地区、 不同人群、不同时期间被客观公正地比较和评价,仍然是统计学家们一直在研究的主题。

weixin_46579654的博客 5439

Halcon 形态学 开发案例 (开运算opening(先腐蚀再膨胀)、闭运算closing(先膨胀再腐蚀))

算子方法:功能:使用用户自定义的结构元素对区域进行开运算参数: Region(输入参数) :输入区域 StructElement(输入参数) :结构元素(区域) RegionOpening(输出参数) :开运算后的区域功能:使用圆形结构元素对区域进行开运算参数: Region(输入参数) :输入区域 RegionOpening(输出参数) :开运算后的区域 Radius(输入参数) :圆形结构元素的半径功能:使用矩形结构元素对区域进行开运算。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1618

【codeforces - 909C - Python Indentation】DP

In Python, code blocks don't have explicit begin/end or curly braces to mark beginning and end of the block. Instead, code blocks are defined by indentation. We will consider an extremely simplifie

Lesroad 714

Vibe Coding 实战指南:用 3 类社区资源实现每周高效追新

介绍一种分层技术雷达校准方法,通过领域过滤器(L1技术栈锚定、L2能力映射、L3场景收敛)精准筛选AI编程相关更新,结合可验证的Shell命令与CI任务卡,将信息过载压缩为可执行、可审计的工程实践。

weixin_27251469的博客 329

python--IndentationError:

都知道python是对格式要求很严格的,写了一些python但是也没发现他严格在哪里,今天遇到了IndentationError: unexpected indent错误我才知道他是多么的严格。     以后遇到了IndentationError: unexpected indent你就要知道python编译器是在告诉你“Hi,老兄,你的文件里格式不对了,可能是tab和空格没对齐的问题,你需

liguo9860的专栏 1万+

绿盾用户使用看图软件每次都需要把图片解密之后才能打开查看,怎么才能不用这么麻烦打开就能看

Win10专业版绿盾控制台7.0看图软件FastStone Image Viewer。

本博客,博文仅代表个人操作经验,不能完全解决你的问题,仅供参考,佛系回复。 1201

【linux】linux 出现一个网卡绑定多个ip怎么处理

我的原因是我使用了dhcp,这个会自动分配ip, 将 BOOTPROTO 参数由 dhcp 改为 static,并移除或注释掉与动态分配地址 10.0.2.15 相关的配置行(如果存在)。执行后,您可以再次使用 ip -4 a 或 ifconfig 命令确认 IP 地址已被移除。输出可以看出,您的虚拟机(k8s003)中存在一个名为 enp0s3 的网卡绑定了多个 IPv4 地址。对于某些 Linux 发行版(如 Ubuntu、Debian),您可能需要编辑网络接口的配置文件来移除多余的 IP 地址。

九师兄 297

Codeforces Round #455 (Div. 2)C_Python Indentation_DP

题意python语言有两种语句,simple语句(s语句)和for语句(f语句)。其中for语句的循环体需要缩进一格,并且不能为空(for语句的循环体里至少有一个s语句或for语句)。给出n条语句,问总共有多少种合法的缩进方法。思路dp[i][j] 第i行缩进j格的种数。 如果第i行是f语句,它的下一行只能放在它的循环体里,缩进格数只能加一。dp[i+1][j+1] = dp[i][j] 如果

弱的奋斗之旅 316

【雕爷学编程】一款功能强大、易于使用、适用范围广泛的嵌入式Python解释器:MicroPython

1、语法方面:Micropython与Python语法基本相同,但是由于Micropython是专门为嵌入式设备设计的,因此它对标准Python的功能进行了精简和优化,去掉了一些不必要的功能,同时增加了一些嵌入式系统特有的功能。3、库方面:Micropython与Python完全不同的是,它的标准库并不完全与Python的标准库一致,特别是一些底层库和硬件相关的库。5、丰富的库和工具支持:MicroPython有丰富的库和工具支持,如GPIO控制、网络连接、传感器数据采集等,可满足各种应用需求。

雕爷学编程 5194

codeforces 909C Python Indentation

题解:看上去就很像是DP题,实际上也的确是DP题。 首先考虑相对暴力的DP,用f[i][j]表示到第i个代码段为止缩进是j的方案数,那么转移就只要分类讨论一下,如果这一段是f那就是f[i][j]=f[i-1][j-1],f[i][0]=0,如果是s,那么可以随意把缩进往回拉,所以这一部分应该是,其中cnt表示目前已经累计的f的数量(也就是可能的最多的缩进数)。 这个写法的时间复杂度是,空间复杂...

temp06的博客 249

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Codeforces 909C Python Indentation:树状数组优化dp

题目链接:http://codeforces.com/contest/909/problem/C 题意:   Python是没有大括号来标明语句块的,而是用严格的缩进来体现。   现在有一种简化版的Python,只有两种语句:     (1)'s'语句:Simple statements. 相当于一般语句。     (2)'f'语句:For statements. 相当于for...

a1392136的博客 155

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Codeforces - 909C - Python Indentation - 简单dp

http://codeforces.com/problemset/problem/909/C 好像以前做过,但是当时没做出来,看了题解也不太懂。 一开始以为只有上面的for有了循环体,这里的statement就可以随便放,但其实并不是这样,statement的位置会取消比它缩进更多或相等的for的可append性。所以设计dp顺序的时候要用dp[i][j]表示第i行剩余可选for循环数量为j的...

weixin_30300523的博客 85

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

CodeForces 909C Python Indentation

题解:$dp$。 $dp[i][j]$表示到第$i$个字母,且该字母在第$j$层的方案数,转移分析一下就知道了。 #include <bits/stdc++.h> using namespace std; const long long mod = 1e9 + 7; const int maxn = 5000 + 10; int n, f; char op[...

weixin_34250709的博客 168

Codeforces 909C - Python Indentation

909C - Python Indentation 思路:dp。 http://www.cnblogs.com/Leohh/p/8135525.html 可以参考一下这个博客,我的dp是反过来的,这样就可以边转移边求前缀和,不需要用树状数组优化。 代码: #include<bits/stdc++.h> using namespace std; #define pb ...

weixin_34144848的博客 121

Codeforces909C Python Indentation(动态规划)

http://codeforces.com/problemset/problem/909/C dp[i][j]表示第i行缩进j的方案数。 当第i-1行为f时,无论当前行是f或s都必须缩进,即dp[i][j+1]=dp[i-1][j]; 当第i-1行为s时,无论当前行时f或s,缩进j的方案数为第i-1行缩进j~n的方案数。 最后注意%1e+7 1 #include<i...

weixin_30443895的博客 116

codeforces 909C. Python Indentation

动态规划的题目 状态转移方程参考https://www.cnblogs.com/Leohh/p/8135525.html #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include...

weixin_30387339的博客 171

Codeforces 909 C. Python Indentation (DP+树状数组优化)

题目链接:Python Indentation 题意:   Python是没有大括号来标明语句块的,而是用严格的缩进来体现。现在有一种简化版的Python,只有两种语句:  (1)'s'语句:Simple statements. 相当于一般语句。(2)'f'语句:For statements. 相当于for循环,并且规定它的循环体不能为空。  然后给你一段没有缩进的Python...

175

dp-------CodeForces 909C. Python Indentation

time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output In Python, code blocks don't have explicit begin/end or curly braces to

swin16的博客 421
上一篇: codeforces 911 E. Stack Sorting
下一篇: codeforces 909 D. Colorful Points
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值