hdu 1514 Free Candies 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1514
题目意思:有4堆糖果,每堆糖果有n个,从上到下排好,取糖果只能从上往下取,取完的糖果放在篮子里,篮子里最多放5个,如果篮子里有两个颜色相同的糖果则可以取走放进口袋里,问最多能取走多少对糖果放进口袋。n<=40, 糖果颜色最多20种。
这题是抄这个人滴:http://fudq.blog.163.com/blog/static/1913502382014239225290/
有些地方看得不太懂,本来想搜状态压缩DP来体会下的,阴差阳错、迷迷糊糊找到了这题= =.......可能水平不太够啦,先留着吧.......能理解到的我都写注释了,不能理解的打了个“?”
只能说,DP好抽象啊,泪 >_< ,慢慢来吧,继续努力!!!
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <set>
using namespace std; const int candy_num = + ;
const int basket_num = + ; // dp[i][j][k][l]: 四个糖堆分别拿走了几个
// 第1个pile被取走i个,第2个pile被取走j个,第3个pile被取走k个,第4个pile被取走l个时pocket能装入的candy数
// h[i]:记录第i个糖堆被取走了多少糖果
int dp[candy_num][candy_num][candy_num][candy_num];
int h[basket_num], f[candy_num][basket_num];
int ans, n; set<int> S;
set<int> ::iterator it; int check(int a)
{
it = S.find(a);
if (it != S.end()) // basket里面有颜色跟当前颜色(a)相同的糖果,从basket里拿出
{
S.erase(a);
return ;
}
S.insert(a); // basket中没有a这种颜色,放入basket中
return ;
} int dfs(int tmp)
{
if (dp[h[]][h[]][h[]][h[]] != -) // 这个状态搜过
return dp[h[]][h[]][h[]][h[]];
int tt = ;
for (int i = ; i < ; i++) // 从四个basket中拿糖果
{
if (h[i] < n && S.size() < )
{
int t = check(f[h[i]][i]);
if (S.size() < )
{
h[i]++; // 第i个pile里被取走一个candy
tt = max(tt, dfs(tmp+t)); // ?
h[i]--;
}
tt = max(tt, tmp+t); // ?
if (t == )
S.insert(f[h[i]][i]);
else
S.erase(f[h[i]][i]);
}
}
return dp[h[]][h[]][h[]][h[]] = tt;
} int main()
{
while (scanf("%d", &n) != EOF && n)
{
for (int i = ; i < n; i++)
{
for (int j = ; j < ; j++)
scanf("%d", &f[i][j]);
}
/* for (int i = 0; i < n; i++)
{
for (int j = 0; j < 4; j++)
printf("f[%d][%d] = %d\n", i, j, f[i][j]);
}
*/
ans = ;
h[] = h[] = h[] = h[] = ;
memset(dp, -, sizeof(dp));
printf("%d\n", dfs());
// printf("dp[%d][%d][%d][%d] = %d\n", h[0], h[1], h[2], h[3], dp[h[0]][h[1]][h[2]][h[3]]);
}
return ;
}
hdu 1514 Free Candies 解题报告的更多相关文章
- HDU 4303 Hourai Jeweled 解题报告
HDU 4303 Hourai Jeweled 解题报告 评测地址: http://acm.hdu.edu.cn/showproblem.php?pid=4303 评测地址: https://xoj. ...
- hdu 2544 最短路 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目意思:给出 n 个路口和 m 条路,每一条路需要 c 分钟走过.问从路口 1 到路口 n 需 ...
- 【LeetCode】575. Distribute Candies 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 题目地址:ht ...
- ACM 杭电HDU 2084 数塔 [解题报告]
数塔 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- hdu 1972.Printer Queue 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1972 题目意思:需要模拟打印机打印.打印机里面有一些 job,每个job被赋予1-9的其中一个值,越大 ...
- hdu 1014.Uniform Generator 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1014 题目意思:给出 STEP 和 MOD,然后根据这个公式:seed(x+1) = [seed(x) ...
- hdu 1098 Lowest Bit 解题报告
题目链接:http://code.hdu.edu.cn/game/entry/problem/show.php?chapterid=1§ionid=2&problemid=22 ...
- hdu 1232 畅通工程 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232 并查集入门题.最近在学并查集,它无非包括三个操作:make_set(x).union_set(x ...
- hdu 1050 Moving Tables 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1050 这道题目隔了很久才做出来的.一开始把判断走廊有重叠的算法都想错了.以为重叠只要满足,下一次mov ...
随机推荐
- MySQL中blob 与 text
BLOB是一个二进制大对象,可以容纳可变数量的数据.有4种BLOB类型:TINYBLOB.BLOB.MEDIUMBLOB和LONGBLOB.它们只是可容纳值的最大长度不同. 有4种TEXT类型:TIN ...
- 激活win10系统的方法(亲测)
WIN+X 按A (或者点击左下角有个windows小图标“鼠标右键”选择选择“命令提示符号(管理员)”) 输入下面命令,回车(一行按一个回车键)slmgr.vbs /upkslmgr /ipk W2 ...
- PAT (Advanced Level) 1087. All Roads Lead to Rome (30)
暴力DFS. #include<cstdio> #include<cstring> #include<cmath> #include<vector> # ...
- CODEVS_1033 蚯蚓的游戏问题 网络流 最小费用流 拆点
原题链接:http://codevs.cn/problem/1033/ 题目描述 Description 在一块梯形田地上,一群蚯蚓在做收集食物游戏.蚯蚓们把梯形田地上的食物堆积整理如下: a(1,1 ...
- Linux最常用的命名
一.环境配置 vim /etc/sysconfig/network-scripts/ifcfg-eth0 vim /etc/sysconfig/network vim /etc/hostname vi ...
- 简单、强大的swig.js
Swig.js A simple, powerful, and extendable JavaScript Template Engine. 简单概括:JS模板引擎. Why to use 根据路劲渲 ...
- IntelliTrace窗口无法弹出的解决办法
最近在使用EF框架,所以需要IntelliTrace窗口进行对ADO的SQL生成监控.可找了半天都无法Call出该窗口. 在Debug模式下,选择调试->窗口 里面根本没有IntelliTrac ...
- vim字符串替换命令
呜呜老是忘. 这里记录一下,仅仅记录当中日经常使用的最多的命令. :%s/str1/str2/g 替换每一行中全部str1为str2 经常使用! :s/str1/str2/g 替换当前行全部str ...
- C++ Primer 学习笔记与思考_7 void和void*指针的使用方法
(一)void的含义 void的字面意思是"无类型",void差点儿仅仅有"凝视"和限制程序的作用,由于从来没有人会定义一个void变量,让我们试着来定义: v ...
- 依据iPhone6设计稿动态计算rem值
rem 单位在做移动端的h5开发的时候是最常常使用的单位. 为解决自适应的问题.我们须要动态的给文档的更节点加入font-size 值.使用mediaquery 能够解决问题,可是每个文件都引用一大串 ...