【题解】SHOI2001化工厂装箱员
————传送:洛谷P2530
这道题目还是挺简单的,状态也容易想到。
数据范围非常的小,所以即便是很多维度,复杂度也完全可以接受。定义状态:dp[i][a][b][c]为手上的货物拿到第i个时三种物品分别有a, b, c个所用的最少次数。
状态转移就暴力枚举是放下a,b,c中的哪一个。
只不过需要特判一下n<10的情况。//再一次对自己丑陋的代码有点接受无能……
#include <bits/stdc++.h>
using namespace std;
#define maxn 102
#define INF 999999
int n, ans = INF, suma[maxn], sumb[maxn], sumc[maxn], dp[maxn][][][];
char c[maxn]; int min(int a, int b)
{
if(b == -) return a;
if(a == -) return b;
return a < b ? a : b;
} int trans(int x, int y, int aa, int bb, int cc)
{
int a = suma[y] - suma[x], b = sumb[y] - sumb[x], c = sumc[y] - sumc[x];
int sum = a + b + c + aa + bb + cc;
bool done = false;
if(sum - aa <= ) done = true, dp[y][a][b + bb][c + cc] = min(dp[x][aa][bb][cc] + , dp[y][a][b + bb][c + cc]);
if(sum - bb <= ) done = true, dp[y][a + aa][b][c + cc] = min(dp[x][aa][bb][cc] + , dp[y][a + aa][b][c + cc]);
if(sum - cc <= ) done = true, dp[y][a + aa][b + bb][c] = min(dp[x][aa][bb][cc] + , dp[y][a + aa][b + bb][c]);
if(!done) return -;
else return ;
} int main()
{
scanf("%d\n", &n);
memset(dp, -, sizeof(dp));
for(int i = ; i <= n; i ++)
{
cin >> c[i];
suma[i] = suma[i - ];
sumb[i] = sumb[i - ];
sumc[i] = sumc[i - ];
if(c[i] == 'A') suma[i] ++;
else if(c[i] == 'B') sumb[i] ++;
else sumc[i] ++;
}
if(n < )//特判
{
ans = ;
if(suma[n]) ans ++;
if(sumb[n]) ans ++;
if(sumc[n]) ans ++;
printf("%d\n", ans);
return ;
}
dp[][suma[]][sumb[]][sumc[]] = ;
for(int i = ; i <= n; i ++)
{
for(int aa = ; aa <= ; aa ++)
for(int bb = ; bb <= ; bb ++)
for(int cc = ; cc <= ; cc ++)
{
if(dp[i][aa][bb][cc] == -) continue;
for(int j = i + ; j <= n; j ++)
if(trans(i, j, aa, bb, cc) == -) break;
}
}
for(int aa = ; aa <= ; aa ++)
for(int bb = ; bb <= ; bb ++)
for(int cc = ; cc <= ; cc ++)
{
if(dp[n][aa][bb][cc] == -) continue;
int tem = ;
if(aa) tem ++;
if(bb) tem ++;
if(cc) tem ++;
ans = min(ans, dp[n][aa][bb][cc] + tem);
}
printf("%d\n", ans);
return ;
}
【题解】SHOI2001化工厂装箱员的更多相关文章
- 洛谷 P2530 [SHOI2001]化工厂装箱员 解题报告
P2530 [SHOI2001]化工厂装箱员 题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B ...
- [SHOI2001]化工厂装箱员
题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须 ...
- 洛谷P2530 [SHOI2001]化工厂装箱员
题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须把不 ...
- [SHOI2001]化工厂装箱员(dp?暴力:暴力)
118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须把不同纯度 ...
- 解题:SHOI2001 化工厂装箱员
题面 题外话:从零开始的DP学习系列之壹(我真的不是在装弱,我DP真的就这么烂TAT) 从lyd那里学到了一点DP的小技巧,在设状态时可以先假装自己在做搜索,往一个函数里传了一些参数,然后把这些参数抓 ...
- SHOI2001化工厂装箱员——记忆化搜索
题目:https://www.luogu.org/problemnew/show/P2530 太弱了不会用DP,于是暴搜: 每次传进一个数组c记录当前状态各种物品有多少个,枚举取哪种物品,返回最小值, ...
- 化工厂装箱员(洛谷 P2530)
题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须 ...
- 化工厂装箱员 洛谷 p2530
题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B:1%,C:0.01%,为了出售方便,必须 ...
- Luogu 2530 化工厂装箱员
Written with StackEdit. Description \(118\)号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有\(3\ ...
随机推荐
- ASP.NET成员资格和角色管理
一.成员资格管理 1.成员资格管理模型 ASP.NET提供的成员资格管理功能,其核心是利用内置的成员库表(SQL Server).成员资格管理API(Membership.MembershipUser ...
- 上传文件到阿里云linux服务器
在“运行”中输入cmd,打开控制台,切换到刚才Putty的安装目录下,我的是E:\Putty,然后输入pscp命令,我们需要这个命令来实现文件的上传.如下图所示,命令格式为: pscp D:\recy ...
- 使用Win32DiskImager后重置SD卡
再1.Windows diskpart命令 diskpart 2.列出所有的磁盘 lisk disk 3.选择U盘所在的磁盘 4.清除磁盘 clean 5.创建主分区 create primary p ...
- PHP如何实现99乘法表?
看到这个问题,可能大家更多的是考虑到用for循环,个人觉得使用for循环太影响程序性能.推荐使用递归处理. /** * Title : 递归实现99乘法表 * Author : Bruceqi * ...
- 更新Composer依赖报错处理Fatal error: Declaration of Fxp\Composer\AssetPlugin\Repository\AbstractAssetsRe
更新Composer依赖报错处理 Fatal error: Declaration of Fxp\Composer\AssetPlugin\Repository\AbstractAssetsRe po ...
- Laravel-admin 当使用Form组件hasMany的时候 进行编辑出现错误 foreach错误的时候解决方案
我的关联关系原名是 goodImage 修改成 image 之后解决问题 分析得出应该是 laravel会将goodImage 转成 good_image字段 这样就foreach会报错 所以出 ...
- aioysql(异步操作MySQL)-python
python异步IO初探 探索异步IO执之前,先说说IO的种类 阻塞IO最简单,即读写数据时,需要等待操作完成,才能继续执行.进阶的做法就是用多线程来处理需要IO的部分,缺点是开销会有些大. 非阻塞I ...
- POJ2762 单向连通图(缩点+拓扑排序
Going from u to v or from v to u? Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 19552 ...
- Python3 time模块&datetime模块&random模块
''' time模块 ''' # import time # print(help(time)) # help()提供帮助 # print(time.time()) # 1970年开始到现在的秒数(时 ...
- [Cracking the Coding Interview] 4.2 Minimal Tree 最小树
Given a sorted(increasing order) array with unique integer elements, write an algorithm to create a ...