前言

这次模拟赛出的好bt,这道题被出成T1,只有一个人A了,而我却被卡到了80pts80pts80pts。

分析

看一眼题目与数据范围,搜索时间一定炸,显然是一道DpDpDp。

设dp[i][j]dp[i][j]dp[i][j]为以iii结尾,前面有jjj个空格的总方案数。

我们可以分为两种情况:

1.s[i-1]=‘f’

这种情况比较简单,因为有一个限制是每一个fff下面必须不为空,所以说当前这个的位置必须是在上一个字符的下一层,也就是下一个包含在上一个中,

for example:


fxx表示'f'或's'

于是我们就可以推出来这样一个转移方程:
dp[i][j]=dp[i−1][j−1](s[i−1]==′f′)dp[i][j] = dp[i - 1][j - 1](s[i-1]=='f')dp[i][j]=dp[i−1][j−1](s[i−1]==′f′)

2.s[i-1]=‘s’

这种情况稍显复杂,因为如果上一个字符为sss的话,那么下面一个字符就可以在不超过上一个的层数的任何位置,设上一个在第x层,那么这一个位置就可以在x-1,x-2,x-3…2,1这一些层数在0~x-1的位置,故上一个dp[i−1][j]dp[i-1][j]dp[i−1][j]的方案数可以加到dp[i][k](0<=k<=j)dp[i][k](0<=k<=j)dp[i][k](0<=k<=j)这里面。

for example:


  s
xsxsxx表示'f'或's'

于是我们就可以推出来这样一个转移方程:
dp[i][j]=∑(dp[i−1][k])dp[i][j] = \sum(dp[i - 1][k])dp[i][j]=∑(dp[i−1][k])

其中k>=j。

时间复杂度问题

如果第二种世界暴力写的话,可以发现最坏时间复杂度为O(n3)O(n^3)O(n3),绝对会T。于是考虑后缀和,优化一下时间复杂度,在第二种情况就可以O(n)O(n)O(n)更新,于是总的时间复杂度为O(n2)O(n^2)O(n2)。

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#define MOD 1000000007
const int MAXN = 5e3 + 5;
int n,sum[MAXN],dp[MAXN][MAXN],ans,Sum[2][MAXN];
char s[MAXN];
int main() {scanf("%d",&n);for(int i = 1;i <= n;i ++) {scanf("\n%c",&s[i]);if(s[i] == 'f') sum[i + 1] = sum[i] + 1;else sum[i + 1] = sum[i];}if(s[n] == 'f') return printf("0"),0;dp[1][0] = 1,Sum[0][0] = 1;for(int i = 2;i <= n;i ++) {if(s[i - 1] == 's')for(int j = sum[i];j >= 0;j --) {dp[i][j] += Sum[0][j],dp[i][j] %= MOD;Sum[1][j] = Sum[1][j + 1] + dp[i][j],Sum[1][j] %= MOD;}   else for(int j = sum[i];j >= 0;j --)dp[i][j] = dp[i - 1][j - 1],dp[i][j] %= MOD,Sum[1][j] = Sum[1][j + 1] + dp[i][j],Sum[1][j] %= MOD;memcpy(Sum[0],Sum[1],sizeof(Sum[1]));}for(int i = 0;i <= sum[n];i ++)ans += dp[n][i],ans %= MOD;printf("%d",ans);return 0;
}

CF909C python Indentation相关推荐

  1. [2.9训练]【CF909C】Python Indentation,【CF909D】Colorful Points,【CF909E】Coprocessor

    文章目录 T1:Python Indentation 题目 题解 code T2:Colorful Points 题目 题解 code T3:Coprocessor 题目 题解 code T1:Pyt ...

  2. codeforces 909C. Python Indentation

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

  3. python示例_Python中的缩进示例

    python示例 It is generally good practice for you not to mix tabs and spaces when coding in Python. Doi ...

  4. python范例_最佳Python代码范例

    python范例 Python is a general purpose programming language which is dynamically typed, interpreted, a ...

  5. Vim与Python真乃天作之和

    本文由编程派-EarlGrey翻译,首发于编程派.原文出自realpython,是Vim的爱好者专门针对利用Sublime Text 3设置Python IDE一文所写.译者本人也是依照Sublime ...

  6. 用html编写一个无序列表,输出HTML无序列表python

    看起来你在试图建立一个网站.为什么不使用一个模板引擎,比如Jinja2,而不是从函数中打印一个HTML片段呢?为此,您将需要一个Python web应用程序,它似乎是在一个web框架中编写的.我会选择 ...

  7. Python Code Examples Python代码示例!

    Python is a general purpose programming language which is dynamically typed, interpreted, and known ...

  8. vim 离线安装_VIM学习笔记 插件列表(Plugin)

    由于zhihu的垃圾编辑器不支持表格,请查看以下完整格式: http://yyq123.github.io/learn-vim/learn-vim-plugin.html 说明: 本列表完全基于作者的 ...

  9. SpaceVim - 让你的vim变得更加高效和强大

    SpaceVim 中文手册 项 目 主 页: https://spacevim.org Github 地址 : https://github.com/SpaceVim/SpaceVim SpaceVi ...

最新文章

  1. 敏捷为什么会失败之「PA-SA-WAKA-DA」理论
  2. 敏捷项目管理任务卡片多选
  3. 二十三、oracle pl/sql分类三 包
  4. Samba的简介和配置
  5. 我的BERT!改改字典,让BERT安全提速不掉分(已开源)
  6. 快速的利用 Express 框架实现一个 Rustfull 接口的后端 Server
  7. 【分治】动态点分治 ([ZJOI2007]捉迷藏)
  8. 关于v8 Javascript engine 的使用方法研究 (二)转
  9. 1709意思_期货m1709是什么意思
  10. iOS 仿微信朋友圈实现
  11. 垃圾盒制作过程大揭密!
  12. Android 保存视频以及读取视频
  13. vue生成海报(vue-canvas-poster)
  14. 详解linux杀死进程方法:kill、pkill、killall之间的区别及用法!
  15. 前端面试题《CSS》
  16. 57BYG250B步进电机+SR4驱动器
  17. Swift5.1 语言参考(三) 类型
  18. 筹码集中度的判断方法
  19. GIt后悔药:还原提交的操作(谨慎操作)
  20. Spring boot Mybatis传入对象中有数组array时使用${}、#{}批量映射存储多个字段

热门文章

  1. lisp程序绘制大树_LISP – 树
  2. CPS渠道统计难?你可能没用过这个统计工具
  3. 继承与派生(Part Ⅲ)——多重继承 虚基类
  4. 腾云忆想科技和腾讯关系_科技内循环,机会远大于风险
  5. Codeforces Round #670(Div. 2) A,B,C,D,E
  6. 6.5 Rviz中控制机器人模型运动
  7. 美术 建模3D模型网站推荐
  8. 双系统怎么用linux做引导盘,巧用安装盘实现双系统引导
  9. matlab 图像接缝_接缝雕刻算法似乎是无法调整图像大小的方法
  10. 一文掌握项目管理工具 —— 时标网络图