Vijos 1323: 化工厂装箱员
题形:DP
题意:A,B,C三种物品,一共N个,顺序摆放,按顺序拿。每次手上最多能拿10个物品,然后可以将某个类别的物品分类放好,再从剩下的拿,补全10个。问最少放几次,可以把所有物品分类好。
思路:
第一次见这种DP.……感觉应该是宽搜求最短路吧?好奇怪
dp[i][a][b][c] 表示 拿到第i个物品,手上剩A物品a个,B物品b个,C物品c个,这个状态时,所用的最少的次数。
假设我们这次拿A,则
dp[i+a] [sum['A'][i+a]-sum['A'][i]] [b+sum['B'][i+a] - sum['B'][i]] [c+sum['C'][i+a] - sum['C'][i]] = min(本身,dp[i][a][b][c] + 1)
反正挺容易理解的,拿掉多少个a,补多少个,然后重新计算现在手上有的a,b,c。
然后暴力递推啊递推。。结果就过了。
哦对了,答案在所有 a,b,c都为0的状态里。取最小的一个。(所以不能只推到n结束,要多推10个)
代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 120 int sum[][N];
int dp[N][][][]; int main() {
int n;
while (scanf("%d", &n) != EOF) {
for (int i = ; i < ; i++) sum[i][] = ;
for (int i = ; i <= n; i++) {
char str[];
scanf("%s", str);
for (int j = ; j < ; j++) {
sum[j][i] = sum[j][i-];
}
sum[str[]-'A'][i]++;
}
if (n <= ) {
int cnt = ;
for (int j = ; j < ; j++) {
if (sum[j][n]) cnt++;
}
printf("%d\n", cnt);
continue;
} for (int i = n+; i <= n+; i++) {
for (int j = ; j < ; j++) {
sum[j][i] = sum[j][i-];
}
} memset(dp, 0x3f, sizeof(dp)); dp[][sum[][]][sum[][]][sum[][]] = ; int ans = ;
for (int i = ; i <= n+; i++) {
for (int a = ; a <= ; a++) {
for (int b = ; b <= -a; b++) {
for (int c = ; c <= -a-b; c++) {
if (dp[i][a][b][c] >= 0x3f3f3f3f) continue;
if (a==&&b==&&c==) {
if (ans > dp[i][a][b][c]) ans = dp[i][a][b][c];
}
int &dpNoA = dp[i+a][sum[][i+a]-sum[][i]][b + sum[][i+a]-sum[][i]][c + sum[][i+a] - sum[][i]];
int &dpNoB = dp[i+b][a + sum[][i+b]-sum[][i]][sum[][i+b]-sum[][i]][c + sum[][i+b] - sum[][i]];
int &dpNoC = dp[i+c][a + sum[][i+c]-sum[][i]][b + sum[][i+c]-sum[][i]][sum[][i+c] - sum[][i]];
dpNoA = min(dpNoA, dp[i][a][b][c]+);
dpNoB = min(dpNoB, dp[i][a][b][c]+);
dpNoC = min(dpNoC, dp[i][a][b][c]+);
}
}
}
}
printf("%d\n", ans);
}
return ;
}
Vijos 1323: 化工厂装箱员的更多相关文章
- 洛谷 P2530 [SHOI2001]化工厂装箱员 解题报告
P2530 [SHOI2001]化工厂装箱员 题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B ...
- 化工厂装箱员(洛谷 P2530)
题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须 ...
- 化工厂装箱员 洛谷 p2530
题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须 ...
- [SHOI2001]化工厂装箱员
题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须 ...
- [SHOI2001]化工厂装箱员(dp?暴力:暴力)
118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须把不同纯度 ...
- Luogu 2530 化工厂装箱员
Written with StackEdit. Description \(118\)号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有\(3\ ...
- 洛谷P2530 [SHOI2001]化工厂装箱员
题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须把不 ...
- [ SHOI 2001 ] 化工厂装箱员
\(\\\) \(Description\) 传送带上按顺序传过来\(N\)个物品,一个有\(A,B,C\)三类. 每次装箱员手里只能至多拿十个,然后将手中三类物品中的一类装箱,才能接着拿或接着装箱, ...
- 解题:SHOI2001 化工厂装箱员
题面 题外话:从零开始的DP学习系列之壹(我真的不是在装弱,我DP真的就这么烂TAT) 从lyd那里学到了一点DP的小技巧,在设状态时可以先假装自己在做搜索,往一个函数里传了一些参数,然后把这些参数抓 ...
随机推荐
- matlplotlib绘图(二)
matplotlib基础知识 matpltlib中的基本图表包括的元素 1.x轴和y轴:水平和垂直的轴线 2.x轴和y轴的刻度:刻度标识坐标值的分隔,包括最小刻度和最大刻度 3.x轴和y轴刻度:表示特 ...
- MongoDB - 启动&连接数据库
1> 启动数据库 1.1> 依次添加如下目录: 1.1.1> mongodb-space 1.1.2> mongodb-space/conf 1.1.3> mongodb ...
- html5音频audio对象处理以及ios微信端自动播放和息屏后唤醒的判断---可供参考(功能都完整实现了,只是细节还没处理的很好)
// html模版中的 此处结合了weui样式整合的微信手机端片段代码(不可直接粘贴复制进行使用)里面含有一些php的写法,可直接略过..###重点参考js代码### <div> < ...
- python中文件操作的六种模式及对文件某一行进行修改的方法
一.python中文件操作的六种模式分为:r,w,a,r+,w+,a+ r叫做只读模式,只可以读取,不可以写入 w叫做写入模式,只可以写入,不可以读取 a叫做追加写入模式,只可以在末尾追加内容,不可以 ...
- Docker工具
虚拟化 什么是虚拟化 在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源, 如服务器.网络.内存及存储等,予以抽象.转换后呈现出来, 打破实体结构间的 ...
- python中的内建函数
本文用作记录python中的内建函数及其功能,本文内容随时补充. 完整的内建函数及其说明参考官方文档: https://docs.python.org/3.5/library/functions ...
- visual studio 2013 for windows desk报error MSB8020: The build tools for v141错误
由于硬件限制,学习在touchgfx暂时在Windows下模拟仿真,了解其基本原理和有一个基本感性认识,因此安装了VS Express 2013 for Desktop轻量级编译器. 有TouchGF ...
- 线段树:CDOJ1597-An easy problem C(区间更新的线段树)
An easy problem C Time Limit: 4000/2000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Pr ...
- java内存模型学习
根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 虚拟机的内存模型分为两部分:一部分是线程共享的,包括 Java 堆和方法区:另一部分是线程私有的,包括虚拟 ...
- linux随笔三
1.ps 结果输出: PID TTY TIME CMD pts/ :: bash pts/ :: ps显示了程序的进程ID,其运行的终端和进程使用的cpu时间