POJ 2609 DP 双队列DP
POJ 2609 DP 双队列DP
题意
- 给出队列容量与一组数,并且我们有两个这样容量的空队列,要求我们按照次序把数装进两个队列中,输出最多能装多少以及每个数装进哪个队列。
思路
- 由于按照次序来装,不能跳过,所以我们可以使用DP寻路的思想来做。状态可以设置为:
\]
显然k = sum[i] - j (sum[i]为前缀和),那么k这一维是不必要的,所以剩下两维,空间上不会超
故状态转移为
\]
注意细节处理以及记录路径
做题的时候,答案用int定义,输出的时候用了lld的占位符,交上去之后WA,是一次经验。
AC代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
long long aa[1005];
long long su[1005];
bool ff[505][10005] = {{0}};
bool bk[505][10005] = {0};
long long l;
void dfs(int i, int j)
{
if (!i)
{
return;
}
if (bk[i][j])
{
dfs(i - 1, j - aa[i]);
printf("port\n");
}
else
{
dfs(i - 1, j);
printf("starboard\n");
}
}
int main()
{
while (scanf("%lld", &l) == 1)
{
memset(ff, 0, sizeof(ff));
memset(bk, 0, sizeof(bk));
su[0] = 0;
l *= 100;
int cnt = 0;
while (scanf("%d", &aa[++cnt]) && aa[cnt])
{
su[cnt] = aa[cnt] + su[cnt - 1];
}
--cnt;
int cc = 0, co = 0;
ff[0][0] = 1;
for (int i = 1; i <= cnt; ++i)
{
for (int j = max(aa[i], su[i - 1] - l); j <= l; ++j)
{
ff[i][j] |= ff[i - 1][j - aa[i]];
if (ff[i - 1][j - aa[i]])
{
bk[i][j] = true;
cc = j;
co = i;
}
}
for (int j = max((long long)0, su[i] - l); j <= l; ++j)
{
ff[i][j] |= ff[i - 1][j];
if (ff[i - 1][j])
{
cc = j;
co = i;
}
}
}
printf("%d\n", co);
dfs(co, cc);
}
return 0;
}
POJ 2609 DP 双队列DP的更多相关文章
- POJ 2609 Ferry Loading(双塔DP)
Ferry Loading Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1807 Accepted: 509 Sp ...
- POJ 1180 Batch Scheduling (dp,双端队列)
#include <iostream> using namespace std; + ; int S, N; int T[MAX_N], F[MAX_N]; int sum_F[MAX_N ...
- POJ 3017 DP + 单调队列 + 堆
题意:给你一个长度为n的数列,你需要把这个数列分成几段,每段的和不超过m,问各段的最大值之和的最小值是多少? 思路:dp方程如下:设dp[i]为把前i个数分成合法的若干段最大值的最小值是多少.dp转移 ...
- POJ 3017 单调队列dp
Cut the Sequence Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8764 Accepted: 2576 ...
- POJ 1821 单调队列+dp
题目大意:有K个工人,有n个墙,现在要给墙涂色.然后每个工人坐在Si上,他能刷的最大范围是Li,且必须是一个连续子区间,而且必须过Si,他刷完后能获得Pi钱 思路:定义dp[i][j]表示前i个人,涂 ...
- Dividing the Path POJ - 2373(单调队列优化dp)
给出一个n长度的区间,然后有一些小区间只能被喷水一次,其他区间可以喷水多次,然后问你要把这个区间覆盖起来最小需要多少喷头,喷头的半径是[a, b]. 对于每个只能覆盖一次的区间,我们可以把他中间的部分 ...
- POJ 1821 Fence(单调队列优化DP)
题解 以前做过很多单调队列优化DP的题. 这个题有一点不同是对于有的状态可以转移,有的状态不能转移. 然后一堆边界和注意点.导致写起来就很难受. 然后状态也比较难定义. dp[i][j]代表前i个人涂 ...
- [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)
DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...
- [USACO2004][poj2373]Dividing the Path(DP+单调队列)
http://poj.org/problem?id=2373 题意:一条直线分割成N(<=25000)块田,有一群奶牛会在其固定区域吃草,每1把雨伞可以遮住向左右延伸各A到B的区域,一只奶牛吃草 ...
- vijos 1243 生产产品 DP + 单调队列优化
LINK 题意:有1个产品,m个步骤编号为1~m.步骤要在n个机器人的手中生产完成.其中,第i个步骤在第j个机器人手中的生产时间给定为$T[i][j]$,切换机器人消耗cost.步骤必须按顺序,同一个 ...
随机推荐
- MySQL5.7版本单节点大数据量迁移到PXC8.0版本集群全记录-1
一个5.7版本的MySQL单点数据库,版本信息是: Server version: 5.7.31-log MySQL Community Server (GPL) 数据量已达到760G,日常存在性能问 ...
- 每天5分钟复习OpenStack(三)
每天5分钟复习OpenStack(三) 为什么要拉起kvm 虚拟机要熟悉这些操作? 作为一个运维工程师,将来有大量的时间是在制作镜像,镜像的制作就是在kvm虚拟化环境拉起kvm 管理的虚拟机的过程,安 ...
- 聊聊基于Alink库的特征工程方法
示例代码及相关内容来源于<Alink权威指南(Java版)> 独热编码 OneHotEncoder 是用于将类别型特征转换为独热编码的类.独热编码是一种常用的特征编码方式,特别适用于处理类 ...
- QT(9)-QStyleOption及其子类
1 QStyleOption QStyleOption及其子类包含QStyle函数绘制图形元素所需的所有信息. 出于性能考虑,成员函数很少,对成员变量的访问是直接的(即使用.或者->运算符).这 ...
- Go 方法集合与选择receiver类型
Go 方法集合与选择receiver类型 目录 Go 方法集合与选择receiver类型 一.receiver 参数类型对 Go 方法的影响 二.选择 receiver 参数类型原则 2.1 选择 r ...
- nginx 配置 proxy_next_upstream 会出现未预期 502 错误问题排查
当使用nginx代理多个网关实例时, 当被请求服务的get 接口异常时,如 error timeout invalid_header http_500 http_502 http_503 http_5 ...
- 题解 ARC104F
前言 在这里首先感谢一下题解区的 FZzzz,本人的题解思路主要是基于他并给出了自己的理解. 如非特殊说明,本题解中的数学符号原则上与题目中一致. 题目分析 需要转化的喵喵题. 我们需要把原问题转化成 ...
- vivado生成Bitstream报错[Vivado 12-1345] Error(s) found during DRC. Bitgen not run(Vivado 2017.4)。
写了一个很简单的程序,2-4译码器. module decoder2to4( input in1, in0, output reg [3:0]out ); always @ (*) begin if ...
- A-B数对 (hash映射)
题目大意: 第一行输入N,C 第二行输入n个数字 输出,求A - B = C的数对个数 样例 4 1 1 1 2 3 输出 3 思路:用STL容器map,map<num, times>,建 ...
- Windows10下的hexo搭建
用hexo搭建个人博客 查看效果:慢蜗牛博客 目录 用hexo搭建个人博客 准备环境 Github Node.js和Git 连接Github 安装hexo 安装插件 部署 Hexo 到 GitHub ...