倍增DP太难啦心情好再回去做

poj1821 先让工匠按s排序,f[i][j]表示枚举到第i个工匠涂了j个木板(注意第j个木板不一定要涂)

那么f[i][j]可以直接继承f[i-1][j]和f[i][j-1]

此外 f[i][j]=max(j-l[i]+1<=k<=s[i]){f[i-1][k-1]+(j-k+1)*p}

按照单调队列运用的思想,维护f[i-1][k-1]-k*p的最大值

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; struct node{int l,p,s;}a[];
bool cmp(node n1,node n2){return n1.s<n2.s;} int f[][];
int h,t,q[];
int main()
{
int m,n;
scanf("%d%d",&m,&n);
for(int i=;i<=n;i++)
scanf("%d%d%d",&a[i].l,&a[i].p,&a[i].s);
sort(a+,a+n+,cmp); memset(f,,sizeof(f));
for(int i=;i<=n;i++)
{
h=,t=;
for(int k=max(,a[i].s-a[i].l+);k<=a[i].s;k++)
{
while(h<=t&&f[i-][k-]-a[i].p*k>=f[i-][q[t]-]-a[i].p*q[t])t--;
q[++t]=k;
}
for(int j=;j<a[i].s;j++)f[i][j]=max(f[i-][j],f[i][j-]);
for(int j=a[i].s;j<=m;j++)
{
while(h<=t&&max(,j-a[i].l+)>q[h])h++;
f[i][j]=max(f[i-][j],f[i][j-]);
if(h<=t)f[i][j]=max(f[i][j],a[i].p*(j+)+f[i-][q[h]-]-a[i].p*q[h]);
}
}
printf("%d\n",f[n][m]);
return ;
}

poj1821

poj3017 神题(其实还好吧)

设f[i]表示1~i的最小值,f[i]=min(∑(k=j+1~i)a[k]<=m){f[j]+max(j+1~i)(a[k])}

然而,可以证明的是,可能成为最优决策的j,一定是j+1~i的最大值,或者是满足∑(k=j+1~i)a[k]<=m最小的j

那么就可以维护一个a[j]递减的单调队列,但是f[j]+max(j+1~i)(a[k])是不单调的,要用set把值记录

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<set>
using namespace std;
typedef long long LL; int a[],q[];
LL f[];
multiset<LL>s;
int main()
{
int n;LL m;
scanf("%d%lld",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]>m){printf("-1\n");return ;}
} int tp=;LL sum=;
int h=,t=;
for(int i=;i<=n;i++)
{
sum+=a[i];while(sum>m)sum-=a[tp++]; while(h<=t&&a[i]>=a[q[t]])
{
if(h<t)s.erase(f[q[t-]]+a[q[t]]);
t--;
}
q[++t]=i;
if(h<t)s.insert(f[q[t-]]+a[q[t]]);
while(h<=t&&tp>q[h])
{
if(h<t)s.erase(f[q[h]]+a[q[h+]]);
h++;
}
f[i]=f[tp-]+a[q[h]];
if(h<t)f[i]=min(f[i],*s.begin());
}
printf("%lld\n",f[n]);
return ;
}

poj3017

hdu2191 (纯粹是给单调队列维护多重背包找个例题)

把一个数拆成u+p*V的形式,f[u+p*V]=max(p-C<=k<=p-1){f[u+k*V]+(p-k)*W}

维护下f[u+k*V]-k*W

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; int f[],q[];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int m,n,W,V,C;
scanf("%d%d",&m,&n);
memset(f,,sizeof(f));
for(int i=;i<=n;i++)
{
scanf("%d%d%d",&V,&W,&C);
for(int u=;u<V;u++)
{
int h=,t=; int li=(m-u)/V;
for(int k=max(,li-C);k<=li-;k++)
{
while(h<=t&&(f[u+q[t]*V]-q[t]*W)<=(f[u+k*V]-k*W))t--;
q[++t]=k;
}
for(int p=li;p>=;p--)
{
while(h<=t&&q[h]>p-)h++;
if(h<=t)f[u+p*V]=max(f[u+p*V],f[u+q[h]*V]+(p-q[h])*W);
if(p-C->=)
{
while(h<=t&&(f[u+q[t]*V]-q[t]*W)<=(f[u+(p-C-)*V]-(p-C-)*W))t--;
q[++t]=p-C-;
}
}
}
}
int ans=;
for(int i=;i<=m;i++)ans=max(ans,f[i]);
printf("%d\n",ans);
}
return ;
}

hdu2191

0x59 单调队列优化DP的更多相关文章

  1. 单调队列优化DP,多重背包

    单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...

  2. bzoj1855: [Scoi2010]股票交易--单调队列优化DP

    单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...

  3. hdu3401:单调队列优化dp

    第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...

  4. Parade(单调队列优化dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others)    ...

  5. BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP

    BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP Description 有一排n棵树,第i棵树的高度是Di. MHY要从第一棵树到第n棵树去找他的妹子玩. 如果MHY在 ...

  6. 【单调队列优化dp】 分组

    [单调队列优化dp] 分组 >>>>题目 [题目] 给定一行n个非负整数,现在你可以选择其中若干个数,但不能有连续k个数被选择.你的任务是使得选出的数字的和最大 [输入格式] ...

  7. [小明打联盟][斜率/单调队列 优化dp][背包]

    链接:https://ac.nowcoder.com/acm/problem/14553来源:牛客网 题目描述 小明很喜欢打游戏,现在已知一个新英雄即将推出,他同样拥有四个技能,其中三个小技能的释放时 ...

  8. 单调队列以及单调队列优化DP

    单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...

  9. BZOJ1791[Ioi2008]Island 岛屿 ——基环森林直径和+单调队列优化DP+树形DP

    题目描述 你将要游览一个有N个岛屿的公园.从每一个岛i出发,只建造一座桥.桥的长度以Li表示.公园内总共有N座桥.尽管每座桥由一个岛连到另一个岛,但每座桥均可以双向行走.同时,每一对这样的岛屿,都有一 ...

随机推荐

  1. NGinx 负载均衡作用

    1.负载均衡介绍: 负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助.其工作模式为将外部发送来的请求均匀分配到对称结构中的 ...

  2. 5.30dao-service-controller层,mybatis自动生成。(获取根据id主键获取指定详细数据)

    获取权限详细数据:(参考)                    1.controller:1.注入Servcie调用方法findConsumerById(参数是id);               ...

  3. Tomcat 程序无问题的情况下页面打开变慢的原因

    看看这写日志的频率就知道我有多闲了.. 前言: 其实关于tomcat,遇到过很多关于“慢”的问题,比如启动慢,比如页面打开慢, 以前太忙也太懒,不愿意花时间分析原因,现在终于肯静下来找原因 环境是ec ...

  4. Java常见错误整理(一)

    1.配置完Java环境变量之后,仍然不能使用java命令. 解决方法: 如果是Windows10系统出现此问题,是因为个别Windows10系统不识别“JAVA_HOME”环境变量,将path中所有的 ...

  5. Android Studio项目中有用文件与可忽略文件(初学者)

    可通过Settings --> Version Control --> Ignored Files进行设置或察看: 支持指定文件或文件夹,也支持匹配模式. Android Studio 中 ...

  6. 【SQL】IN、EXISTS和表连接三者的效率比较

    一. IN和EXISTS比较 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行查询.此时就会用到IN和EXISTS. 例如:查询departments表中存在的部门的人数. 1. 使 ...

  7. WEB笔记-3、盒子模型+定位+显示

      3.1 盒子模型 边距控制 margin/padding:上 右 下 左:   padding:内容和边距之间的空间 margin:”盒子“外撑开的空间,两个相邻标签外边距会出现重叠和累加的现象, ...

  8. JAVA 构建使用 Native 库

    Java 使用Native文件,一般分解为下面几个步骤: 在Java代码中使用native关键字声明一个本地方法 运行javah,获得包含该方法声明的C语言头文件(使用jni编程中的C函数名通常是相关 ...

  9. 读白帽子web安全笔记

    点击劫持 frame buseting if (top.location != location) { top.location = self.location } html5的sandbox属性   ...

  10. 详解CorelDRAW智能填充工具的运用

    使用智能填充工具可以为任意的闭合区域填充颜色并设置轮廓.与其他填充工具不同,智能填充工具仅填充对象,它检测到区域的边缘并创建一个闭合路径,因此可以填充区域.例如,智能填充工具可以检测多个对象相交产生的 ...