UVA 10118 Free Candies
https://vjudge.net/problem/UVA-10118
题目
桌上有4堆糖果,每堆有$N$($N\leqslant 40$)颗。有个熊孩子拿了个可以装5颗糖的篮子,开始玩无聊的装糖游戏。他每次选一堆糖,并把这堆最上面的糖装进篮子里面,如果篮子里有两个种类相同的糖,那么他就把这两个糖装进自己的口袋里。给出四堆糖中每一颗糖的种类(1..20),问最多能装多少对糖。
题解
一开始看这题,拿糖的顺序有$\mathcal{O}(P(4^40,40))$种,一下就茫然了(估计得太松了……)
设dp[a][b][c][d]为分别拿了这么多桌上的糖的数量时最多还能拿多少糖,很容易写出转移方程……
这样状态数为$\mathcal{O}(n^4)$,转移数为4,复杂度$\mathcal{O}(n^4)$,还是可以
有个问题是篮子的空间有限制,但四堆糖确定后篮子剩余空间就确定了
计算到这里的时候说明能到达这个状态
因为一旦篮子里有两个相同的糖就会装进口袋,所以篮子里不会有两个相同的糖
那么要到达这个状态,篮子里一定只剩拿了奇数的糖
(又是乱证明= =)
只有20种糖,直接二进制压位
AC代码
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
using namespace std; #define REP(r,x,y) for(register int r=(x); r<(y); r++)
#define PER(r,x,y) for(register int r=(x); r>(y); r--)
#define REPE(r,x,y) for(register int r=(x); r<=(y); r++)
#define PERE(r,x,y) for(register int r=(x); r>=(y); r--)
#ifdef sahdsg
#define DBG(...) printf(__VA_ARGS__)
#else
#define DBG(...) (void)0
#endif
int d[47][47][47][47];
int p[47][4];
int n;
int DP(int arr[4], int k, int cp) {
int &now=d[arr[0]][arr[1]][arr[2]][arr[3]];
if(now>=0) return now;
now=0;
REP(i,0,4) {
if(arr[i]<n) {
int iid=p[arr[i]][i];
arr[i]++;
if(k&(1<<iid)) {
now = max(now,DP(arr,k^(1<<iid),cp-1)+1);
} else {
if(cp+1<=4) {
now = max(now,DP(arr,k^(1<<iid),cp+1));
}
}
arr[i]--;
}
}
return now;
}
int main() {
#ifdef sahdsg
freopen("in.txt", "r", stdin);
#endif
while(~scanf("%d", &n) && n) {
memset(d,-1,sizeof d);
REP(i,0,n) {
scanf("%d%d%d%d", &p[i][0], &p[i][1], &p[i][2], &p[i][3]);
}
int h[4]; memset(h,0,sizeof h);
DP(h,0,0);
printf("%d\n", d[0][0][0][0]);
}
return 0;
}
UVA 10118 Free Candies的更多相关文章
- UVA - 10118 Free Candies 记忆化搜索经典
思路:d[a][b][c][d]表示从已经第一个篮子取了a颗糖,第二个取了b颗糖,第三个取了c颗糖,第四个取了d颗糖最多还能够获得多少糖果.首先明白一个问题:如果能分别取a,b,c,d个,不论如何取, ...
- UVa 10118 Free Candies (记忆化搜索+哈希)
题意:有4堆糖果,每堆有n(最多40)个,有一个篮子,最多装5个糖果,我们每次只能从某一堆糖果里拿出一个糖果,如果篮子里有两个相同的糖果, 那么就可以把这两个(一对)糖果放进自己的口袋里,问最多能拿走 ...
- UVA - 10118 Free Candies(免费糖果)(dp---记忆化搜索)
题意:桌上有4堆糖果,每堆有N(N<=40)颗.佳佳有一个最多可以装5颗糖的小篮子.他每次选择一堆糖果,把最顶上的一颗拿到篮子里.如果篮子里有两颗颜色相同的糖果,佳佳就把它们从篮子里拿出来放到自 ...
- uva 10118
10118 - Free Candies Time limit: 30.000 seconds Little Bob is playing a game. He wants to win some c ...
- uva 10118(DP)
UVA 10118 题意: 有4堆糖果,每堆有n(最多40)个,有一个篮子,最多装5个糖果,我们每次只能从某一堆糖果里拿出一个糖果, 如果篮子里有两个相同的糖果,那么就可以把这两个(一对)糖果放进自己 ...
- D - Free Candies UVA - 10118
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- UVa 10118 记忆化搜索 Free Candies
假设在当前状态我们第i堆糖果分别取了cnt[i]个,那么篮子里以及口袋里糖果的个数都是可以确定下来的. 所以就可以使用记忆化搜索. #include <cstdio> #include & ...
- 【Uva 10118】Free Candies
[Link]: [Description] 有4堆书; 每本书编号从1..20 每堆书都是N本; 然后每次只能从任意一堆的堆顶拿一本书装到自己的口袋里; 你的口袋最多容纳5本书; 当你的口袋里有两本一 ...
- Uva 10118 免费糖果
题目链接:https://uva.onlinejudge.org/external/101/10118.pdf 参考:http://www.cnblogs.com/kedebug/archive/20 ...
随机推荐
- Linux常见命令(一)
三.常见linux命令: 命令提示符的解释: (1).组成(默认):[root@localhost~]# (2)[root@localhost~] root:系统当前登录账户名称,超级管理员为root ...
- vue生成二维码插件qrcodejs2
1.页面 <div id="qrCode" ref="qrCodeDiv"></div> 2.导入插件 import QRCode fr ...
- windows蓝屏代码
原始链接 引用自 https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/bug-check-code-referenc ...
- android 开发之 ListView 与Adapter 应用实践
在开发android中,ListView 的应用显得非常频繁,只要需要显示列表展示的应用,可以说是必不可少,下面是记录开发中应用到ListView与Adapter 使用的实例: ListView 所在 ...
- 章节九、4-ChromDriver介绍
一.首先下载Chrom浏览器驱动,将驱动解压到存放火狐浏览器驱动文件路径中(请观看前面的章节) 1.进入该网址下载匹配本地浏览器版本的驱动 http://chromedriver.storage.go ...
- C#-委托delegate
目录 委托的定义 委托的声明 委托的实例 委托的注意细节 泛型委托(详见<精通C#>--10.4泛型委托) 1.Action<>委托 3.Func<>委托 附录 委 ...
- 【公众号系列】超详细SAP HANA JOB全解析
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[公众号系列]超详细SAP HANA JOB全解 ...
- C#常用的网络组件
常用的网络组件 using System.Net;//为多种网络协议提供统一和简单的编程接口 using System.Net.Mail;//为简单邮件传输协议的服务器提供E-mail发送的类 usi ...
- Linux学习历程——Centos 7 top命令
一.命令介绍 top 命令用于动态的监控进程活动与系统负载信息. 格式为 top [参数] 二.实例 直接运行top命令 top命令执行结果的前五行为系统整体的统计信息,代表含义如下: 第1行:系统时 ...
- IOS开发protocol使用
1.什么是protocol? protocol(协议)是用来定义对象的属性和行为,用于回调. 2.protocol分类? 协议中有三个修饰关键字@required和@optional和@propert ...