Codeforces 909C Python Indentation:树状数组优化dp
题目链接: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的更多相关文章
- Codeforces 946G Almost Increasing Array (树状数组优化DP)
题目链接 Educational Codeforces Round 39 Problem G 题意 给定一个序列,求把他变成Almost Increasing Array需要改变的最小元素个数. ...
- HDU 6240 Server(2017 CCPC哈尔滨站 K题,01分数规划 + 树状数组优化DP)
题目链接 2017 CCPC Harbin Problem K 题意 给定若干物品,每个物品可以覆盖一个区间.现在要覆盖区间$[1, t]$. 求选出来的物品的$\frac{∑a_{i}}{∑b_ ...
- LUOGU P2344 奶牛抗议 (树状数组优化dp)
传送门 解题思路 树状数组优化dp,f[i]表示前i个奶牛的分组的个数,那么很容易得出$f[i]=\sum\limits_{1\leq j\leq i}f[j-1]*(sum[i]\ge sum[j- ...
- 【题解】Music Festival(树状数组优化dp)
[题解]Music Festival(树状数组优化dp) Gym - 101908F 题意:有\(n\)种节目,每种节目有起始时间和结束时间和权值.同一时刻只能看一个节目(边界不算),在所有种类都看过 ...
- 【题解】ARC101F Robots and Exits(DP转格路+树状数组优化DP)
[题解]ARC101F Robots and Exits(DP转格路+树状数组优化DP) 先删去所有只能进入一个洞的机器人,这对答案没有贡献 考虑一个机器人只能进入两个洞,且真正的限制条件是操作的前缀 ...
- Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)
题意: 线段树做法 分析: 因为每次都是在当前位置的前缀区间查询最大值,所以可以直接用树状数组优化.比线段树快了12ms~ 代码: #include<cstdio> #include< ...
- BZOJ3594: [Scoi2014]方伯伯的玉米田【二维树状数组优化DP】
Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感 ...
- BZOJ 3594: [Scoi2014]方伯伯的玉米田 (二维树状数组优化DP)
分析 首先每次增加的区间一定是[i,n][i,n][i,n]的形式.因为如果选择[i,j](j<n)[i,j](j<n)[i,j](j<n)肯定不如把后面的全部一起加111更优. 那 ...
- 4.9 省选模拟赛 划分序列 二分 结论 树状数组优化dp
显然发现可以二分. 对于n<=100暴力dp f[i][j]表示前i个数分成j段对于当前的答案是否可行. 可以发现这个dp是可以被优化的 sum[i]-sum[j]<=mid sum[i] ...
随机推荐
- 微信小程序 --- 页面跳转
第一种:wx.navigateTo({}); 跳转: 注意:这种跳转回触发当前页面的 onHide 方法,将当前页面隐藏,然后显示跳转页面.所以可以返回,返回的时候触发 onShow方法进行显示: ( ...
- ThinkPHP分页用异步来做,玩转分页类!
具体为什么用异步来做分页我就不多说了! 用异步来做分页,主要还是看分页类怎么玩! 方便管理,还是把Ajax分页作为一个工具来使用: 同样新建工具类: 多次尝试,最终修改好的分页类是这样的:(我自己使用 ...
- 【node】----mocha单元测试框架-----【巷子】
1.mocha简介 单元测试是用来对一个模块.一个函数.或者一个类来进行正确性的检测工作 特点: 既可以测试简单的JavaScript函数,又可以测试异步代码, 可以 ...
- Zend_Framework_1 框架是如何被启动的?
Zend Framework 1 是一个十年前的老框架了,我接触它也有两年了,现在来写这篇文章,主要原因是最近要写入职培训教程.公司项目基本上都是基于Zend1框架,即使现在要转 Laravel 也肯 ...
- 使用Atom预览markdown
1.打开任意.md文件(markdown源文件)2.windows : ctrl + shift + pmac : command + shift + p这条命令跟Sublime Text是一样的,打 ...
- [3D]1.绘制三角形
作为一个.Net程序员学习3D开发好尴尬啊,因为不论是OpenGL还是Direct3D都是用C/C++开发的比较多.虽然有计划使用C++进行开发,但是平时还是C#使用的多.很少用C++做东西,如果仅仅 ...
- DIY自己的GIS程序(1)——起航
一个GIS系统最重要的功能是绘制图形和关联属性,这里研究二维点线面的绘制过程: 对于一个绘图系统设计,图形的绘制涉及两个重要的方面. 1.一个是绘制或者重新绘制,重绘过程出现在下面情况: a 界面初始 ...
- sysbench压测mysql基本步骤
MySQL数据库测试 select 1.先创建数据库test,再准备数据 time /usr/local/sysbench/bin/sysbench --test=oltp --num-threa ...
- [golang grpc] 框架介绍
官方网站 http://www.grpc.io/ http://www.grpc.io/docs/quickstart/go.html grpc安装 • go安装 目前grpc需要go 1.5以上版本 ...
- 常微分方程初值问题:多步预测-修正方法 [MATLAB]
#先上代码后补笔记# #可以直接复制粘贴调用的MATLAB函数代码!# 1. 亚当斯(Adams)预测-修正算法 由亚当斯-巴什福特(Adams-Bashforth)显式预测公式和亚当斯-莫顿(Ada ...