UVA_10118

我们可以定义f[n1][n2][n3][n4]为当四个piles分别拿到第n1、n2、n3、n4个糖果时,能够拿回家的最多的pair数,然后在状态转移的时候需要借助一个数组来记录basket的情况,可以容易想象的是,对于一个f状态,一定有唯一一个basket的状况(当然假设能取走的糖果都取走了)与之相对应。

为了实现起来更方便,我还是选用了记忆化搜索。

#include<stdio.h>#include<string.h>#define MAXD 50int N, f[MAXD][MAXD][MAXD][MAXD], x[5][MAXD];int init(){int i, j;    scanf("%d", &N);if(!N)return 0;for(i = 0; i < N; i ++)for(j = 0; j < 4; j ++)            scanf("%d", &x[j][i]);return 1;}int dp(int y[], int s, int t[]){int i, j, k, max = 0;if(f[t[0]][t[1]][t[2]][t[3]] != -1)return f[t[0]][t[1]][t[2]][t[3]];if(s == 5)return f[t[0]][t[1]][t[2]][t[3]] = 0;for(i = 0; i < 4; i ++)if(t[i] != N)        {int r[25];            memcpy(r, y, sizeof(r));int top[5];            memcpy(top, t, sizeof(top));            top[i] ++;if(r[x[i][t[i]]])            {                r[x[i][t[i]]] = 0;                k = dp(r, s - 1, top);if(k + 1 > max)                    max = k + 1;            }else            {                r[x[i][t[i]]] = 1;                k = dp(r, s + 1, top);if(k > max)                    max = k;            }        }return f[t[0]][t[1]][t[2]][t[3]] = max;}void solve(){int res, r[25] = {0}, top[5] = {0};    memset(f, -1, sizeof(f));    res = dp(r, 0, top);    printf("%d\n", res);}int main(){while(init())        solve();return 0;}

UVA 10118 Free Candies相关推荐

  1. UVA - 10118 Free Candies 记忆化搜索

    题目链接:UVA - 10118 题目是PDF就不贴了,大意就是有四堆糖果,每堆有n个,有个人有个能盛五个糖的篮子,每次可以任选一堆糖,取最上面的那个放到篮子里,如果篮子里有两个颜色相同的,就可以把这 ...

  2. uva 10118 - Free Candies(记忆化搜索)

    题目大意:10118 - Free Candies 题目大意:有4堆糖果, 每堆糖果有n颗糖果,然后给出每颗糖果的类型1~20,然后只有取走当前堆的前面一颗糖果后才可以取后面的糖果, 然后小伙伴有一个 ...

  3. uva 10118 Free Candies

    原题: Little Bob is playing a game. He wants to win some candies in it - as many as possible. There ar ...

  4. UVA - 10118 Free Candies

    题目链接:https://vjudge.net/problem/UVA-10118 Little Bob is playing a game. He wants to win some candies ...

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

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

  6. uva 10118 ——Free Candies

    题意:桌子上有4 堆糖果,要从这四堆糖果中取出5个,如果5个中有相同的颜色则把他们拿出来放到口袋,求最多放多少糖果. 思路:DAG最长路问题.需要把问题转化成DAG的问题,以个数作为转移的状态,当达到 ...

  7. UVA - 10118 Free Candies(记忆化搜索/状压)

    传送门 方法一 一开始我确实是这样想的,设d[i][j][k][p][S]d[i][j][k][p][S]d[i][j][k][p][S]为四堆分别拿了i,j,k,pi,j,k,pi,j,k,p个,当 ...

  8. Free Candies UVA - 10118

    题目:B - Free Candies UVA - 10118 题意: 桌上有4堆糖果,每堆糖果高度不超过40,每颗糖果有一种颜色(一共20种,1,2,3...,20), 有一个篮子,一开始是空的,每 ...

  9. uva 10118(DP)

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

最新文章

  1. 单继承--多态性 多继承--二义性 ambiguous
  2. python 调用摄像头拍照_《自拍教程67》Python调用摄像头, 拍照拍照!
  3. elasticsearch聚合操作——本质就是针对搜索后的结果使用桶bucket(允许嵌套)进行group by,统计下分组结果,包括min/max/avg...
  4. MySql通用二进制版本在Linux(Ubuntu)下安装与开启服务
  5. mysql 1045 登录失败
  6. 前端---JavaScript基础3
  7. 机器学习(一)—— 线性回归
  8. B. Box Fitting
  9. LeetCode 1101. 彼此熟识的最早时间(排序+并查集)
  10. 源码分析 | 深度解密Go语言之context
  11. c语言中缀表达式求值_数据结构-第三章:栈和队列(栈的应用、括号匹配、表达式转换)
  12. SQL Server 日期和时间函数
  13. zookeeper在hadoop的应用
  14. java sort方法_Java排序方法sort用法详解
  15. 多个值合并成一个字段oracle排序,Oracle之多行记录变一行记录,行变列,并排序(wmsys.wm_concat)...
  16. java object 转 double_Java 类型转换以及Object转成其他类型
  17. Oracle 常用脚本之查看视图、序列、存储过程、触发器、同义词、计划任务等信息
  18. 华为手机照片如何出现时间地点天气,教你30秒,一学就会
  19. 京东网页(动态)搭建,利用jquery实现
  20. 生成对抗网络(GAN)详细介绍及数字手写体生成应用仿真(附代码)

热门文章

  1. 自动化测试工具selenium 之Selenium-IDE
  2. [Web Chart系列之一(续)]Web端图形绘制SVG,VML, HTML5 Canvas 简单实例
  3. oracle安装完成后怎么这么多用户和表,下面哪个用户不是oracle缺省安装后就存在的用户...
  4. java下载好怎么验证_Java JDK下载、安装和验证
  5. jdk自带压测工具_jstack性能分析工具
  6. MATLAB图像处理之图像边缘提取
  7. MySQL中的索引使用
  8. Activiti中databaseSchemaUpdate属性取值
  9. MySQL性能优化一
  10. JDK8新特性LocalDate、LocalTime和LocalDateTime