题形: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: 化工厂装箱员的更多相关文章

  1. 洛谷 P2530 [SHOI2001]化工厂装箱员 解题报告

    P2530 [SHOI2001]化工厂装箱员 题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B ...

  2. 化工厂装箱员(洛谷 P2530)

    题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须 ...

  3. 化工厂装箱员 洛谷 p2530

    题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须 ...

  4. [SHOI2001]化工厂装箱员

    题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须 ...

  5. [SHOI2001]化工厂装箱员(dp?暴力:暴力)

    118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须把不同纯度 ...

  6. Luogu 2530 化工厂装箱员

    Written with StackEdit. Description \(118\)号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有\(3\ ...

  7. 洛谷P2530 [SHOI2001]化工厂装箱员

    题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须把不 ...

  8. [ SHOI 2001 ] 化工厂装箱员

    \(\\\) \(Description\) 传送带上按顺序传过来\(N\)个物品,一个有\(A,B,C\)三类. 每次装箱员手里只能至多拿十个,然后将手中三类物品中的一类装箱,才能接着拿或接着装箱, ...

  9. 解题:SHOI2001 化工厂装箱员

    题面 题外话:从零开始的DP学习系列之壹(我真的不是在装弱,我DP真的就这么烂TAT) 从lyd那里学到了一点DP的小技巧,在设状态时可以先假装自己在做搜索,往一个函数里传了一些参数,然后把这些参数抓 ...

随机推荐

  1. (68)zabbix windows性能计数器使用详解

    概述 windows下的性能计数器让zabbix监控更加轻松,直接获取性能计数器的数值即可完成windows监控.性能计数器如下:   1 perf_counter["\Processor( ...

  2. pm2日志记录和日志分割

    pm2日志记录和日志分割 pm2介绍 pm2是nodejs进程管理工具,现在基本是node生产服务器的标准选择,可以帮助我们实现node多进程服务,开启的多个实例自动实现负载均衡. 最重要的是保证no ...

  3. linux关于yum

    yum仓库设置:1.cd /etc/yum.repos.d yum仓库 2.CentOS-Base.repo 网络源 CentOS-Media.repo 光盘源 设置 vi CentOS-Media. ...

  4. 模拟发送http请求的工具推荐

    做网站开发时,经常需要发送请求来测试自己的代码是否OK,这时候模拟发送http请求的工具就起到了很大的作用.特别是需要在请求带header时就更加的有必要使用工具.下面推荐的工具有的是基于系统开发的程 ...

  5. ActiveXObject

    只有IE浏览器才支持这个构造函数,可以用这个来判断,当前是否为IE浏览器 var isIE=!!window.ActiveXObject; 在IE的不同版本下,要创建XHR对象,也需要通过这个构造函数 ...

  6. Django之用户认证

    用户认证组件简介 功能:用session记录登录验证状态 前提:必须使用django自带的auth_user表.那这里有的同学就会有疑问了,自己不能创建自己的用户表吗? 当然可以,用户认证组件虽然只针 ...

  7. Mr. Panda and Crystal HDU - 6007 最短路+完全背包

    题目:题目链接 思路:不难看出,合成每个宝石需要消耗一定的魔力值,每个宝石有一定的收益,所以只要我们知道每个宝石合成的最小花费,该题就可以转化为一个背包容量为初始魔力值的完全背包问题,每个宝石的最小花 ...

  8. redis--py链接redis【转】

    请给原作者点赞--> 原文链接 一.redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链 ...

  9. bash之条件测试if/else

    bash之条件测试:     if/then结构         条件测试(CONDITION):         test EXPRESSION:测试条件表达式正确否         [ EXPRE ...

  10. loj2028 「SHOI2016」随机序列

    定义区间是内部只含有乘号的区间. 对于区间左端点是 \(l \geq 2\) 的情况,左端点前头是加号的情况和前头是减号的情况的个数是相同的.因此这些区间不对答案产生贡献. 所以区间左端点必定是 \( ...