博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【P1326】超级教主
阅读量:5949 次
发布时间:2019-06-19

本文共 1843 字,大约阅读时间需要 6 分钟。

DP优化

原题:

LHX教主很能跳,因为Orz他的人太多了。教主跳需要消耗能量,每跳1米就会消耗1点能量,如果教主有很多能量就能跳很高。

教主为了收集能量,来到了一个神秘的地方,这个地方凡人是进不来的。在这里,教主的正上方每100米处就有一个能量球(也就是这些能量球位于海拔100,200,300……米处),每个能量球所能提供的能量是不同的,一共有N个能量球(也就是最后一个能量球在N×100米处)。教主为了想收集能量,想跳着吃完所有的能量球。教主可以自由控制他每次跳的高度,接着他跳起把这个高度以下的能量球都吃了,他便能获得能量球内的能量,接着吃到的能量球消失。教主不会轻功,教主不会二段跳,所以教主不能因新吃到的能量而变化此次跳跃的高度。并且教主还是生活在地球上的,所以教主每次跳完都会掉下来。
问教主若要吃完所有的能量球,最多还能保留多少能量。

N≤2000000 

保证对于所有数据,教主都能吃到所有的能量球,并且能量球包含的能量之和不超过2^31-1。

 

sum[i]表示a[i]的前缀和,很容易推出状态转移方程:f[i]=max{j<i && f[j]>=i*100 | f[j]+sum[i]-sum[j]-i*100}

但是数据达到2000000,n^2会T,这是后就要优化

DP优化方法有很多,常用的是记录可行决策然后二分,单调队列,斜率优化,我这么弱斜率优化当然不会,这题似乎不符合单调性质,所以我们搞单调队列

上面的状态转移方程↑中sum[i]-i*100是不会变的,需要考虑的就是f[j]-sum[j]

就可以维护单调队列:如果f[i]>f[队头]就进队,f[j]<i*100的出对,然后在队里找就行了

然而依旧会T

书上说f[i]-s[i]单调递减的,过程比较长,有兴趣的同学可以试着自己推到(逃

又因为i*100是单调递增的,所以只需要记录一个temp表示上一个用到的决策点,从temp往后找到一个f[j]>=i*100就行了

因为f[j]-sum[j]单调递减且i*100单调递增,所以如果有f[j]>=i*100的f[j]>=(i-1)*100也肯定满足,因此从直接从temp开始找就行了,不用管temp前面的

单调性这种东西给数据打个表比较容易发现,优化DP时打个表挺好的

代码;

1 #include
2 #include
3 #include
4 #include
5 #include
6 using namespace std; 7 int read(){
int z=0,mark=1; char ch=getchar(); 8 while(ch<'0'||ch>'9'){
if(ch=='-')mark=-1; ch=getchar();} 9 while(ch>='0'&&ch<='9'){z=(z<<3)+(z<<1)+ch-'0'; ch=getchar();}10 return z*mark;11 }12 int n,m,a[2100000];13 int sum[2100000];14 int f[2100000];15 int temp;16 int main(){
//freopen("ddd.in","r",stdin);17 memset(f,0,sizeof(f));18 cin>>n>>m;19 sum[0]=0;20 for(int i=1;i<=n;i++){ a[i]=read(); sum[i]=a[i]+sum[i-1];}21 f[0]=m; temp=0;22 for(int i=1;i<=n;i++){23 for(;temp
=i*100) break;24 f[i]=f[temp]+sum[i]-sum[temp]-i*100;25 }26 cout<
<
View Code

 

转载于:https://www.cnblogs.com/JSL2018/p/5861687.html

你可能感兴趣的文章
我的友情链接
查看>>
计算机网络练习题(一)
查看>>
Web服务器技术的优缺点
查看>>
gpg命令
查看>>
AndroidMainfest.xml文件解释
查看>>
格式化的盘要怎样寻回资料
查看>>
硬盘格式化了的资料恢复方案
查看>>
centOS6.5 源码编译安装zabbix-server
查看>>
站在0基础的角度--看网络
查看>>
PHP检测终端设备是平板、手机还是电脑
查看>>
win10安装oracle12c遇到[FATAL] [DBT-10304]
查看>>
python数据结构与算法(14)
查看>>
python之Linux基础(十)
查看>>
muma很可能在陪你玩游戏
查看>>
配置IP地址
查看>>
显示字符串子程序
查看>>
JS prototype 属性
查看>>
javascript 操作DOM元素样式
查看>>
常用的Powershell命令
查看>>
这两天学的线程池归纳
查看>>