考试最后半个小时才做这道题。十分钟写了个暴力还写挂了。。最后默默输出n。菜鸡一只。

这道题比较好看出来是动规。首先我们要明确一点。因为能拔高长度任意的一段区域,所以如果从i开始拔高,那么一直拔高到n比一直拔高到j更优。因为j~n变高了对于答案是有利的。

我们定义f[i][j]表示到第i个点前面拔高j次的最大剩余数。在i点的高度为hei[i]+j(因为前面拔高j次,最终都会拔高到n)。所以我们要找在高度小于hei[i]+j,次数小于j里面最大剩余数+1去更新。而找这个有限制的二维前缀最大值,可以用二维树状数组去维护。

注意:

①树状数组第一维最大是heimax+k,第二维最大为k,而不是n

②k可以为0,但是如果为0的话树状数组是跳不出来的。所以我们初始就让k++,让k=1代表k=0

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
#define pos(i,a,b) for(int i=(a);i<=(b);i++)
#define pos2(i,a,b) for(int i=(a);i>=(b);i--)
#define N 11000
int n,k;
int hei[N];
int f[N][510];
int c[N][510];
int maxhei;
int lowbit(int x){
	return x&(-x);
}
void add(int i,int j,int num){
	for(int ii=i;ii<=maxhei+k;ii+=lowbit(ii))
	  for(int jj=j;jj<=k;jj+=lowbit(jj))
	    c[ii][jj]=max(c[ii][jj],num);
}
int tot(int i,int j){
	int sum=0;
	for(int ii=i;ii;ii-=lowbit(ii))
	  for(int jj=j;jj;jj-=lowbit(jj))
	    sum=max(sum,c[ii][jj]);
	return sum;
}
int main(){
	scanf("%d%d",&n,&k);
	pos(i,1,n){
		scanf("%d",&hei[i]);
		maxhei=max(maxhei,hei[i]);
	}
	k++;
	pos(i,1,n){
		pos2(j,k,1){
			f[i][j]=max(f[i][j],tot(hei[i]+j,j)+1);
			add(hei[i]+j,j,f[i][j]);
		}
	}
	cout<<tot(maxhei+k,k);
	while(1);
	return 0;
}

  

[Scoi2014]方伯伯的玉米田 二维树状数组+动态规划的更多相关文章

  1. [BZOJ3594] [Scoi2014]方伯伯的玉米田 二维树状数组优化dp

    我们发现任何最优解都可以是所有拔高的右端点是n,然后如果我们确定了一段序列前缀的结尾和在此之前用过的拔高我们就可以直接取最大值了然后我们在这上面转移就可以了,然后最优解用二维树状数组维护就行了 #in ...

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

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

  3. SCOI2014 bzoj3594 方伯伯的玉米田(二维树状数组+dp)

    3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1971  Solved: 961[Submit][St ...

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

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

  5. bzoj 3594: [Scoi2014]方伯伯的玉米田【二维树状数组+dp】

    设f[i][j]为前i棵玉米被拔高了j(因为是单调不降所以前面越高越好,所以每次拔一个前缀),转移是f[i][j]=f[k][l]+1,l<=j,a[k]+l<=a[i]+j,然后用二维树 ...

  6. BZOJ 3594 [Scoi2014]方伯伯的玉米田(二维树状数组)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3594 [题目大意] 给出一个数列,选出k个区间使得区间内数全部加1, 求k次操作之后最 ...

  7. bzoj 3594: [Scoi2014]方伯伯的玉米田

    3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 1399  Solved: 627 [Submit][ ...

  8. bzoj 3594: [Scoi2014]方伯伯的玉米田 dp树状数组优化

    3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 314  Solved: 132[Submit][Sta ...

  9. 【题解】Luogu P3287 [SCOI2014]方伯伯的玉米田

    原题传送门 一眼就能看出来这是一道dp题 显而易见每次操作的右端点一定是n,每株玉米被拔高的次数随位置不下降 用f(i,j) 表示以第i 株玉米结尾它被拔高了j 次的最长序列长度. \(f(i,j)= ...

随机推荐

  1. [leetcode-312-Burst Balloons]

    Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by ...

  2. CSS3学习系列之背景相关样式(二)

    在border-radius属性中指定两个半径 在border-radius属性中,可以指定两个半径,指定方法如下所示: border-radius:40px 20px; 针对这种情况,各种浏览器的处 ...

  3. java equals和==区别及string类的说明

    一.equals和==的区别 1.1.equals之string字符串的比较 1.1.1.源码如下图 if (this == anObject) {            return true;  ...

  4. 我的学习之路_第二十七章_jQuery

    jQueryjs类库 把常用对象或者方法封装起来,让我们写代码效率更高 1.jQuery 2.extjs [jQuery入门] jQuery的引入: 通过script标签的src属性引入 入门: 获取 ...

  5. centos+apache 2.x 开启gzip压缩

    最近做了一个网站(PHP+Apache+MySQL),挂在百度云平台上面,基本配置是2G内存+5Mb带宽,每次打开主页都需要2-3s左右的时间,对于一个垂直搜索引擎来说,用户体验肯定会很差. 于是开始 ...

  6. English - Mosquitos

    Smith's house is full of mosquitos. Every night they bite him. He can not sleep because the mosquito ...

  7. 平板点餐软件编程体会---记我的Android编程之路

    前言 想开发一个平板点餐系统,研究下陈江根大侠分享的一个很高水准的实例,只是个单机版无实用意义. (如需运行源码请回复联系邮箱) 实现 Mysql 数据库+Tomcat WEb服务器,使用Servle ...

  8. 设计模式 - 代理模式(jdk)

    定义:为另一个对象提供一个替身或占位符以控制对这个对象的访问. 一.静态代理 静态代理说白了就是把原先直接调用被代理类的方法放到代理类来调用,同时 我们可以在代理类额外的添加一些操作. 接口: pac ...

  9. Spring和SpringMVC父子的容器之道---[上篇]

    Spring和SpringMVC作为Bean管理容器和MVC层的默认框架,已被众多WEB应用采用,而在实际开发中,由于有了强大的注解功能,很多基于XML的配置方式已经被替代,但在实际项目中,我们经常会 ...

  10. git - 远程分支

    对于用户来说,git给人提交到本地的机会.我们可以在自己的机器上创建不同的branch,来测试和存放不同的代码. 对于代码管理员而言,git有许多优良的特性.管理着不同的分支,同一套源代码可以出不一样 ...