题目:UVA - 10118Free Candies(记忆化搜索)

题目大意:给你四堆糖果,每一个糖果都有颜色。每次你都仅仅能拿随意一堆最上面的糖果,放到自己的篮子里。假设有两个糖果颜色同样的话,就行将这对糖果放进自己的口袋。自己的篮子最多仅仅能装5个糖果,假设满了,游戏就结束了。问你可以得到的最多的糖果对数。

解题思路:这题想了好久,好不easy把状态想对了,结果脑子发热,又偏离了方向。dp【a】【b】【c】【d】:四堆糖果如今在最上面的是哪一个。由于以下的糖果假设确定了,那么接下了无论你怎么取,最优的肯定是仅仅有一种。所以能够把如今剩余的糖果的最多数量加上你之前取的那些糖果你能得到的糖果最多数量,就是要求的最多的糖果对数。

dp【a】【b】【c】【d】 = Max(dp【a + 1】【b】【c】【d】 + 0|1, dp[a][b +1】【c】【d】 + 0|1, dp【a】【b】【c + 1】【d】 + 0|1 , dp【a】【b】【c】【d  +1] + 0|1).0 | 1取决于你如今篮子里是否有和我取的那个糖果颜色同样的。相应的篮子里的糖果数量要变化。假设数量等于5了,就说明不能放了,返回0.而且每堆糖果都有最大的数量,取完也是要结束的。这些边界条件要注意.这里发现了一个新的知识:用memcpy的时候假设不是里面的全部数据都要的话,要指明长度,不然可能会出现错误。

代码:

#include <cstdio>
#include <cstring> const int N = 42;
const int M = 5;
const int maxn = 1000005; int candy[N][M];
int top[M];//存放每堆糖果最上面的序号
int f[N][N][N][N];
int n; int Max (const int a, const int b) { return a > b ? a: b; } void init () { memset (f, -1, sizeof (f));
f[n][n][n][n] = 0;//结束状态不论篮子满不满
} bool handle (int r, int c, int k, int *b) {//处理是否有同样的塘果 int *b是篮子,k + 1是里面有的糖果的个数。 int i;
for (i = 0; i < k; i++) { if (candy[r][c] == b[i])
break;
} if (!k || i == k) {
b[k] = candy[r][c];
return false;
} else { for (int j = i; j < k - 1; j++)
b[j] = b[j + 1];
return true;
}
} int dfs (int k, int *bket, int a, int b, int c, int d) { int bket1[M * 2];
int& ans = f[a][b][c][d];
if (k >= M)//篮子满了
return 0;//注意这里ans不一定等于0,由于取糖果的顺序不同的话,这个篮子的情况可能不同
if (ans != -1)
return ans;
top[1] = a;
top[2] = b;
top[3] = c;
top[4] = d;
for (int i = 1; i < M; i++) { /*for (int j = 0; j < k; j++)
bket1[j] = bket[j];*/
memcpy (bket1, bket, k * sizeof (int));//注意
/*for (int j = 0; j < k; j++)
printf ("%d ", bket1[j]);
printf ("\n");*/
if (handle (top[i], i, k, bket1)) { top[i]++;
if (top[i] <= n)
ans = Max (ans, dfs (k - 1, bket1, top[1], top[2], top[3], top[4]) + 1);
} else { top[i]++;
if (top[i] <= n)
ans = Max (ans, dfs (k + 1, bket1, top[1], top[2], top[3], top[4]));
}
top[i]--;
}
return ans;
} int main () { while (scanf ("%d", &n), n) { for (int i = 0; i < n; i++)
for (int j = 1; j < M; j++)
scanf ("%d", &candy[i][j]); int b[M * 2];
init ();
printf ("%d\n", dfs (0, b, 0, 0, 0, 0));
// printf ("%d\n", f[n][n - 1][0][0]);
/* for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
for (int l = 0; l < n; l++)
printf ("%d ", f[i][j][k][l]);
printf ("\n");
}
printf ("\n");
}
printf ("\n");
}
printf ("\n");*/
}
return 0;
}

UVA - 10118Free Candies(记忆化搜索)的更多相关文章

  1. uva 10118,记忆化搜索

    这个题debug了长达3个小时,acm我不能放弃,我又回来了的第一题! 一开始思路正确,写法不行,结果越改越乱 看了网上某神的代码,学习了一下 coding+debug:4小时左右,记忆化搜索+dp类 ...

  2. UVA - 1631 Locker 记忆化搜索

    题意:给定两个密码串,每次可以让1~3个相邻的密码向上或者向下滚动,每个密码是 ,问最少需要多少次滚动可以让原串成为目标串? 思路:假设当前要让第i位密码还原,我们可以同时转动,不同的转动方式会影响后 ...

  3. UVA 11468 Substring (记忆化搜索 + AC自动鸡)

    传送门 题意: 给你K个模式串, 然后,再给你 n 个字符, 和它们出现的概率 p[ i ], 模式串肯定由给定的字符组成. 且所有字符,要么是数字,要么是大小写字母. 问你生成一个长度为L的串,不包 ...

  4. UVA - 10118 Free Candies 记忆化搜索经典

    思路:d[a][b][c][d]表示从已经第一个篮子取了a颗糖,第二个取了b颗糖,第三个取了c颗糖,第四个取了d颗糖最多还能够获得多少糖果.首先明白一个问题:如果能分别取a,b,c,d个,不论如何取, ...

  5. UVa 10118 Free Candies (记忆化搜索+哈希)

    题意:有4堆糖果,每堆有n(最多40)个,有一个篮子,最多装5个糖果,我们每次只能从某一堆糖果里拿出一个糖果,如果篮子里有两个相同的糖果, 那么就可以把这两个(一对)糖果放进自己的口袋里,问最多能拿走 ...

  6. UVa 10118 记忆化搜索 Free Candies

    假设在当前状态我们第i堆糖果分别取了cnt[i]个,那么篮子里以及口袋里糖果的个数都是可以确定下来的. 所以就可以使用记忆化搜索. #include <cstdio> #include & ...

  7. uva 10581 - Partitioning for fun and profit(记忆化搜索+数论)

    题目链接:uva 10581 - Partitioning for fun and profit 题目大意:给定m,n,k,将m分解成n份,然后依照每份的个数排定字典序,而且划分时要求ai−1≤ai, ...

  8. UVA - 10917 - Walk Through the Forest(最短路+记忆化搜索)

    Problem    UVA - 10917 - Walk Through the Forest Time Limit: 3000 mSec Problem Description Jimmy exp ...

  9. UVa 10285 Longest Run on a Snowboard - 记忆化搜索

    记忆化搜索,完事... Code /** * UVa * Problem#10285 * Accepted * Time:0ms */ #include<iostream> #includ ...

随机推荐

  1. latex表格线的颜色设置(边框添加颜色)

    添加了如下包:边框颜色要用到booktabs, colortbl, 包,下面代码里有一个自定义的颜色tabcolor \usepackage{ctexcap} \usepackage{graphicx ...

  2. JavaScript 中的事件类型5(读书笔记思维导图)

    Web 浏览器中可能发生的事件有很多类型.如前所述,不同的事件类型具有不同的信息,而“ DOM3级事件”规定了以下几类事件. UI(User Interface,用户界面)事件:当用户与页面上的元素交 ...

  3. [Cocos2d-x]CCSpriteBatchNode的使用

    文档: http://cocos2d.cocoachina.com/document/index/class?url=dd/d95/classcocos2d_1_1_c_c_sprite_batch_ ...

  4. libuv 与 libev 的对比

    libuv 与 libev 的对比 libuv 与 libev 的对比 05 January 2013 libuv 和 libev ,两个名字相当相近的 I/O Library,最近有幸用两个 Lib ...

  5. Android笔记二十七.Service组件入门(一).什么是Service?

    转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.Service 1.Service简单介绍     Service为Android四大组件之中 ...

  6. CheckBox和RadioButton以及RadioGroup

    CheckBox:复选框 有两种状态 选中状态(true),未选状态(false) 属性 android:checked= "false"(表示该复选框未被选中) RadioGro ...

  7. VSTO学习笔记(十五)Office 2013 初体验

    原文:VSTO学习笔记(十五)Office 2013 初体验 Office 2013 近期发布了首个面向消费者的预览版本,我也于第一时间进行了更新试用.从此开始VSTO系列全面转向Office 201 ...

  8. 敏捷开发-Scrum 真实

    近期研究前 Scrum 数据编译的文件,在接下来的团队和项目开发.项目根据该引入 Scrum 一些练习,提高团队成员和项目之间的交付质量的合作. 参考资料: <轻松Scrum之旅-敏捷开发故事& ...

  9. 新浪SAE数据库信息

    此账号仅能在SAE平台上使用,不能从外部连接我们建议开发者使用SaeMysql操作数据库 如果您想自己实现数据库相关操作,可以使用以下常量: 用户名  : SAE_MYSQL_USER 密 码 : S ...

  10. poj3278(bfs)

    题目链接:http://poj.org/problem?id=3278 分析:广搜,每次三种情况枚举一下,太水不多说了. #include <cstdio> #include <cs ...