博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】2442: [Usaco2011 Open]修剪草坪
阅读量:6882 次
发布时间:2019-06-27

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

【算法】动态规划

【题解】

万物皆动规,每时每刻都要想着DP!特别是这种明显可以序列递推的题目。

一个简单的思路是f[i]表示前i个选择合法方案(第i个可选可不选)的最大效率

f[i]=max(f[i-1],f[j-2]+sum[j~i]),j=i-k+1~i。

然后就可以把f[j]-sum[j+1]加入单调队列了。

单调队列其实很好写的,每次先弹出超限的,然后对于每个i把对应的东西比较队尾后加入队列就可以了。

当然DP优化肯定要先写普通DP来对照和对拍的。

#include
#include
#include
#include
using namespace std;const int maxn=100010;int n,kind;long long sum[maxn],f[maxn];struct cyc{
int p;long long x;}q[maxn];int read(){ char c;int s=0,t=1; while(!isdigit(c=getchar()))if(c=='-')t=-1; do{s=s*10+c-'0';}while(isdigit(c=getchar())); return s*t;}int main(){ n=read();kind=read(); for(int i=1;i<=n;i++)sum[i]=read(),sum[i]+=sum[i-1]; f[0]=0; int head=0,tail=1;q[head]=(cyc){
0,0}; for(int i=1;i<=n;i++){ f[i]=f[i-1]; if(q[head].p
View Code

 

另一种思路是反过来,令f[i]表示不选i的最小放弃值

f[i]=f[j]+a[i],j=i-k~i-1  也就是说j+1~i-1部分全选。

这思路就有意思多了。

 

转载于:https://www.cnblogs.com/onioncyc/p/7454967.html

你可能感兴趣的文章
《富爸爸巴比伦最富有的人》读书笔记3000字
查看>>
分享几个国外学习网站
查看>>
一文分析java基础面试题中易出错考点
查看>>
6月21日云栖精选夜读丨CCTV5手机客户端新媒体:让赛事集锦堪比电影大片
查看>>
$ is not defined错误分析及解决
查看>>
Qt之子类发送消息给父类
查看>>
redis哨兵模式
查看>>
深入源码分析-线程池的实现原理
查看>>
开箱即用(out-of-box)的Redis序列号生成器,不用再写任何代码,你值得拥有
查看>>
Java大牛呕心沥血经历——技术面试与HR谈薪资技巧
查看>>
Pycharm上Django的使用 Day12
查看>>
遇见一只黑猫,她说Python是个怪物
查看>>
spring 中Page< >遇到得小问题
查看>>
IT兄弟连 JavaWeb教程 JavaBean组件定义
查看>>
PowerDesigner 概念数据模型(CDM) 说明
查看>>
JQuery动态给table添加、删除行
查看>>
OSChina 周五乱弹 —— 如果有一天不让我写代码了
查看>>
MySpinner
查看>>
原子变量与非阻塞同步
查看>>
基础总结篇之一:Activity生命周期
查看>>