题目链接:http://codeforces.com/contest/909/problem/C

题意:

  Python是没有大括号来标明语句块的,而是用严格的缩进来体现。

  现在有一种简化版的Python,只有两种语句:

    (1)'s'语句:Simple statements. 相当于一般语句。

    (2)'f'语句:For statements. 相当于for循环,并且规定它的循环体不能为空。

  然后给你一段没有缩进的Python程序,共n行(n <= 5000)。

  问你添加缩进后,有多少种合法且不同的Python程序。

题解:

  表示状态:

    dp[i][j] = numbers

    考虑到第i行,并且第i行的缩进有j个Tab时的合法方案数。

  找出答案:

    ans = ∑ dp[n-1][0 to n-1]

    行号从0开始标。并且对于第i行来说,它的缩进最多有i个Tab。

  如何转移:

    两种情况。

    当前为dp[i][j](用顺推)。

    (1)第i行为'f',则第i+1行的缩进只能为j+1。

      dp[i+1][j+1] += dp[i][j]

    (2)第i行为's',则第i+1行的缩进可以为[0,j]中的任意一种。

      dp[i+1][0 to j] += dp[i][j]

  边界条件:

    dp[0][0] = 1

    第0行的缩进只能为0。

  树状数组优化:

    如果按照上面的方程直接去写的话,枚举状态为O(N^2),转移的第二种情况复杂度为O(N)。

    所以最坏情况下为O(N^3),对于N = 5000肯定炸了……

    所以考虑用树状数组来实现转移的第二种情况,也就是区间加法和单点查询。

    于是总复杂度变为O(N^2*logN)。

    另外,树状数组下标从1开始,所以之前所有的下标都要+1。

  update:

    其实顺推也可以用差分优化掉一个n的啊……

    (打比赛的时候人是瓷的……)

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 5005
#define MOD 1000000007 using namespace std; int n;
int dp[MAX_N][MAX_N];
char c[MAX_N]; void update(int *dat,int k,int x)
{
while(k>)
{
dat[k]=(dat[k]+x)%MOD;
k-=k&-k;
}
} int query(int *dat,int k)
{
int sum=;
while(k<=n)
{
sum=(sum+dat[k])%MOD;
k+=k&-k;
}
return (sum%MOD+MOD)%MOD;
} void sec(int *dat,int l,int r,int x)
{
update(dat,r,x);
update(dat,l-,-x);
} int main()
{
cin>>n;
for(int i=;i<=n;i++) cin>>c[i];
memset(dp,,sizeof(dp));
sec(dp[],,,);
for(int i=;i<=n;i++)
{
for(int j=;j<=i;j++)
{
int now=query(dp[i],j);
if(now)
{
if(c[i]=='f')
{
sec(dp[i+],j+,j+,now);
}
else
{
sec(dp[i+],,j,now);
}
}
}
}
int ans=;
for(int i=;i<=n;i++)
{
ans=(ans+query(dp[n],i))%MOD;
}
cout<<ans<<endl;
}

Codeforces 909C Python Indentation:树状数组优化dp的更多相关文章

  1. Codeforces 946G Almost Increasing Array (树状数组优化DP)

    题目链接   Educational Codeforces Round 39 Problem G 题意  给定一个序列,求把他变成Almost Increasing Array需要改变的最小元素个数. ...

  2. HDU 6240 Server(2017 CCPC哈尔滨站 K题,01分数规划 + 树状数组优化DP)

    题目链接  2017 CCPC Harbin Problem K 题意  给定若干物品,每个物品可以覆盖一个区间.现在要覆盖区间$[1, t]$. 求选出来的物品的$\frac{∑a_{i}}{∑b_ ...

  3. LUOGU P2344 奶牛抗议 (树状数组优化dp)

    传送门 解题思路 树状数组优化dp,f[i]表示前i个奶牛的分组的个数,那么很容易得出$f[i]=\sum\limits_{1\leq j\leq i}f[j-1]*(sum[i]\ge sum[j- ...

  4. 【题解】Music Festival(树状数组优化dp)

    [题解]Music Festival(树状数组优化dp) Gym - 101908F 题意:有\(n\)种节目,每种节目有起始时间和结束时间和权值.同一时刻只能看一个节目(边界不算),在所有种类都看过 ...

  5. 【题解】ARC101F Robots and Exits(DP转格路+树状数组优化DP)

    [题解]ARC101F Robots and Exits(DP转格路+树状数组优化DP) 先删去所有只能进入一个洞的机器人,这对答案没有贡献 考虑一个机器人只能进入两个洞,且真正的限制条件是操作的前缀 ...

  6. Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)

    题意: 线段树做法 分析: 因为每次都是在当前位置的前缀区间查询最大值,所以可以直接用树状数组优化.比线段树快了12ms~ 代码: #include<cstdio> #include< ...

  7. BZOJ3594: [Scoi2014]方伯伯的玉米田【二维树状数组优化DP】

    Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感 ...

  8. BZOJ 3594: [Scoi2014]方伯伯的玉米田 (二维树状数组优化DP)

    分析 首先每次增加的区间一定是[i,n][i,n][i,n]的形式.因为如果选择[i,j](j<n)[i,j](j<n)[i,j](j<n)肯定不如把后面的全部一起加111更优. 那 ...

  9. 4.9 省选模拟赛 划分序列 二分 结论 树状数组优化dp

    显然发现可以二分. 对于n<=100暴力dp f[i][j]表示前i个数分成j段对于当前的答案是否可行. 可以发现这个dp是可以被优化的 sum[i]-sum[j]<=mid sum[i] ...

随机推荐

  1. 解决pip install 安装慢问题

    使用豆瓣源 比如安装pyspark pip install -i https://pypi.douban.com/simple/ pyspark 速度就比用pip install快N倍 关注公众号:

  2. Iframe中子窗体给父窗体传值

    <html> <head> <script type="text/javascript"> function GetData(data) { a ...

  3. ubuntu16.04下用笔记本摄像头和ROS编译运行ORB_SLAM2的单目AR例程

    要编译ORB_SLAM2的ROS例程首先需要安装ROS,以及在ROS下安装usb_cam驱动并调用,最后搭建ORB_SLAM2. 1.ROS的安装 我的电脑安装的是ubuntu16.04系统,所以我安 ...

  4. mendeley不能做中文批注的解决方案

    mendeley是一个很好用且免费的文献管理工具,但在ubuntu系统下,对文献进行批注无法切换中文输入法,实际上对ibus是支持的,但ibus实在是太难用,大部分ubuntu用户钟爱的还是fcitx ...

  5. SNMP 原理及配置简述 net-snmp-utils net-snmp 第2版基于SNMP 群体名(community name) 第3版引入了安全性更高的访问控制方法 SNMP协议操作只有4种 Apache的php_snmp 模块

    SNMP 原理及配置简述  net-snmp-utils  net-snmp 第2版基于SNMP 群体名(community name) 第3版引入了安全性更高的访问控制方法 SNMP协议操作只有4种 ...

  6. centos LB负载均衡集群 三种模式区别 LVS/NAT 配置 LVS/DR 配置 LVS/DR + keepalived配置 nginx ip_hash 实现长连接 LVS是四层LB 注意down掉网卡的方法 nginx效率没有LVS高 ipvsadm命令集 测试LVS方法 第三十三节课

    centos   LB负载均衡集群 三种模式区别 LVS/NAT 配置  LVS/DR 配置  LVS/DR + keepalived配置  nginx ip_hash 实现长连接  LVS是四层LB ...

  7. 为什么Log.nsf中存储的日志只有最近7天的原因

    是由于Domino服务器的notes.ini配置文件中有一行参数: Log = logfilename, log_option, not_used, days, size 比如:Log=log.nsf ...

  8. leetcode 数据库题解

    184. Department Highest Salary 题意: The Employee table holds all employees. Every employee has an Id, ...

  9. mongodb安装及副本集搭建

    mongodb下载地址:https://www.mongodb.com/dr/fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.7.tg ...

  10. lvs原理及各种调度算法详解

    LVS原理详解 LVS原理详解 LVS简介 LVS结构与工作原理 一.LVS的结构 二.LVS内核模型 三.LVS的包转发模型 1.NAT模型: 2.DR模型: 3.TUN模型: 四.LVS的调度算法 ...