【codevs2098】【Tyvj1625】化工厂装箱员,煞笔的人打煞笔的DP
来源:互联网 发布:agile plm java被停止 编辑:程序博客网 时间:2024/05/17 09:34
传送门1
传送门2
写在前面:数据结构题写多了,写dp反而不会写了
思路:刚开始以为是贪心,很快发现这是错误的233(反例很好找的),后来看到n才100,就动了一些歪脑筋打暴力,后来才发现是一个可以记忆化搜索的DP,f[i][x][y][z]指流水线上剩余i个产品,手里有x个A,y个B,z个C时所需要的最少装箱次数,显然我们可以以此转移三种状态:装箱A,装箱B,装箱C,同时记忆化搜索除去了很多重复的状态(比如在流水线上一堆C的情况下装2个A,3个B与装3个B, 2个A效果一样)
注意:别打暴搜,注意细节!
代码:
#include<bits/stdc++.h>using namespace std;int n,a[110],f[110][20][20][20];char ch;bool flag[110][20][20][20];int dfs(int remain,int x,int y,int z){ int tot=x+y+z,k=0; for (int i=n-remain+1;i<=n;i++) { if (tot+k==10) break; if (a[i]==1) x++; if (a[i]==2) y++; if (a[i]==3) z++; k++; } if (flag[remain-k][x][y][z]) return f[remain-k][x][y][z]; flag[remain-k][x][y][z]=1; if (remain-k==0) { f[0][x][y][z]=min(f[0][x][y][z],(x>0)+(y>0)+(z>0));//没有剩余的情况下显然装a,b,c的顺序就无所谓了,直接加上就好 return f[0][x][y][z]; } if (x) f[remain-k][x][y][z]=min(f[remain-k][x][y][z],dfs(remain-k,0,y,z)+1); if (y) f[remain-k][x][y][z]=min(f[remain-k][x][y][z],dfs(remain-k,x,0,z)+1); if (z) f[remain-k][x][y][z]=min(f[remain-k][x][y][z],dfs(remain-k,x,y,0)+1); return f[remain-k][x][y][z];}main(){ scanf("%d",&n); for (int i=1;i<=n;i++) { ch=getchar(); while (ch<'A'||ch>'C') ch=getchar(); a[i]=ch-'A'+1; } memset(f,63,sizeof(f)); printf("%d",dfs(n,0,0,0));}
1 0
- 【codevs2098】【Tyvj1625】化工厂装箱员,煞笔的人打煞笔的DP
- shoi2001 化工厂装箱员
- 关于第一次团队合作的项目中的煞笔
- 不会马拉车的煞笔要学pam
- 徐倩大煞笔
- 煞笔题
- Vijos P1323 化工厂装箱员(SHOI2001)题解
- 洛谷 P2530 [SHOI2001]化工厂装箱员
- 【SHOI2001】洛谷2530 化工厂装箱员
- 洛谷 P2530 [SHOI2001]化工厂装箱员
- 洛谷 P2530 [SHOI2001] 化工厂装箱员
- 搜索 洛谷P2530 [SHOI2001]化工厂装箱员
- 洛谷P2530 [SHOI2001]化工厂装箱员
- 2025哦我他妈的就是一个大煞笔啊卧槽!
- 【codevs1425】最小的N个和,如何像煞笔一样地写堆
- 示蓉灼煞笔诔聊韶屡洗教豢捕副恿
- 煞笔方干活
- 痴俗轮芯前夹夹街诿煞笔煞慈着牟
- python中的协程学习
- 关于Swoole中内存共享和热重启
- map、set、vector、list、stack、queue、deque、priority_queue
- 一个强大的Android模拟器Genymotion
- JAVA对于数字证书的常用操作方法应用解析
- 【codevs2098】【Tyvj1625】化工厂装箱员,煞笔的人打煞笔的DP
- JVM之类文件结构
- 在Windows中使用Git
- linux 学习计划
- String类引用计数的浅拷贝
- 这几个月读完的书
- sublime text3 3103破解
- [BZOJ1500]维修数列 做题笔记
- java锁的种类及研究