题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1059

题目大意:有四堆糖果,称矩阵排列,一共有n行,只能在每一堆的最上方取糖果,病放入篮子中,如果篮子中有相同的颜色的糖果则可以抵消,篮子中最多能盛放5个糖果,当篮子中的

糖果数量达到5个时,游戏结束。问最多能获得多少个糖果。

解法:由于每次都只能从每一堆的最上方取糖果,所以先开一个一维数组 用来记录每一堆取到了第几行,再开一个bool数组,用来判断该颜色的糖果有没有出现过。再开一个四维的数组用来记录该状态的最大能取回多少糖果。

#include<iostream>
#include<cstring>
using namespace std;
int n;
int arr[][];
bool pre[];
int dp[][][][];
int toal[]; int dfs(int x){ if(dp[toal[]][toal[]][toal[]][toal[]]!=-){
return dp[toal[]][toal[]][toal[]][toal[]];
}
if(x==) return ;
int ans=;
for(int i=;i<=;i++){
if(toal[i]==n+) continue ;
int color=arr[toal[i]][i];
if(pre[color]){
pre[color]=;
toal[i]++;
ans=max(ans,dfs(x-)+);//加一
toal[i]--;//回溯
pre[color]=;//回溯 }
else {
pre[color]=;
toal[i]++;
ans=max(ans,dfs(x+));//如果没有相同颜色的糖果,则不用加1
toal[i]--;
pre[color]=;
}
}
// cout<<ans<<endl;
return dp[toal[]][toal[]][toal[]][toal[]]=ans;
} int main(){
cin>>n;
for(int i = ;i<=n;i++)
for(int j=;j<=;j++){
cin>>arr[i][j];
}
memset(dp,-,sizeof(dp));
memset(pre,,sizeof(pre));
for(int i=;i<=;i++){
toal[i]=;
} cout<<dfs()<<endl;
return ;
}

总结:再写dfs的时候,如果定义为int类型,一定要先清楚,,返回值的意义。

D - Free Candies UVA - 10118的更多相关文章

  1. uva 10118(DP)

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

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

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

  3. UVA 10118 Free Candies

    https://vjudge.net/problem/UVA-10118 题目 桌上有4堆糖果,每堆有$N$($N\leqslant 40$)颗.有个熊孩子拿了个可以装5颗糖的篮子,开始玩无聊的装糖游 ...

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

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

  5. UVa 10118 记忆化搜索 Free Candies

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

  6. 【Uva 10118】Free Candies

    [Link]: [Description] 有4堆书; 每本书编号从1..20 每堆书都是N本; 然后每次只能从任意一堆的堆顶拿一本书装到自己的口袋里; 你的口袋最多容纳5本书; 当你的口袋里有两本一 ...

  7. UVA - 10118 Free Candies(免费糖果)(dp---记忆化搜索)

    题意:桌上有4堆糖果,每堆有N(N<=40)颗.佳佳有一个最多可以装5颗糖的小篮子.他每次选择一堆糖果,把最顶上的一颗拿到篮子里.如果篮子里有两颗颜色相同的糖果,佳佳就把它们从篮子里拿出来放到自 ...

  8. Uva 10118 免费糖果

    题目链接:https://uva.onlinejudge.org/external/101/10118.pdf 参考:http://www.cnblogs.com/kedebug/archive/20 ...

  9. uva 10118

    10118 - Free Candies Time limit: 30.000 seconds Little Bob is playing a game. He wants to win some c ...

随机推荐

  1. Check If It Is a Straight Line

    2019-10-21 10:35:33 问题描述: 问题求解: public boolean checkStraightLine(int[][] coordinates) { int n = coor ...

  2. Nuget多项目批量打包上传服务器的简明教程

    本篇不会介绍Nuget是什么,如何打包上传Nuget包,怎么搭建私有Nuget服务器.这些问题园子里都有相应的文章分享,这里不做过多阐述.另外本文假设你已经下载了Nuget.exe,并且已经设置好了环 ...

  3. JSON字符串带BOM头"ufeff"

    调用三方接口返回值JSON字符串带BOM头"\ufeff",JSON解析死活报错. 我是用SpringBoot的RestTemplate调用三方接口的,一开始返回值我是用对象接收返 ...

  4. Android之MVC、MVP、MVVM

    本文将详细阐述以下MVC.MVP.MVVM三种理念的定义 MVC MVC全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个 基本部分:模型(Model ...

  5. 01FPGA设计流程

    今天学习了FPGA设计流程的视频,我理解要做一个完整的FPGA系统,所要经历的步骤,先将它简单总结如下: 我在对上面的流程图进行解释: 第一:设计定义就是我们这个FPGA系统或者FPGA设计所要实现的 ...

  6. Kaggle大牛小姐姐自述:我是怎么成为竞赛中Top 0.3%的 | 干货攻略

    天天跟数据打交道的研究人员,都有一个成为Kaggle顶级大师(Grandmaster)的梦想. 但每年的Kaggle参赛团队众多,通常一个项目都有数千人至上万人报名,如何在其中脱颖而出? 最近,自动化 ...

  7. java 环境变量配置与第一个程序运行

    从开始下载jdk,到运行出java第一个程序 ,花了5天时间 ,不过我相信万事开头难 ,以后会越来越好的 ,加油! jdk的下载: 在oracle官网上即可下载,jdk安装包,下载完以后运行安装 ,路 ...

  8. CodeForces - 1244E

    题意:给n个数,可以有k次的 + 1或 - 1,在k次操作之内,让n个数的最大值和最小值差最小. 思路:要让max和min的差值最小,也就等同于min--,max++,如果k==0结束操作,或者min ...

  9. ||,&&短路规则测试

    短路规则:a||b中若a为真,则直接判断整个表达式为真,不再判断b是真或假,    a&&b中若a为假,则直接判断整个表达式为假,不再单独判断b是真或假. 想要测试这个规则的话,可以将 ...

  10. git本地库中配置多个sshkey

    一般来说正常情况下本地库中配置一个sshkey就可以适应开发了,但是生活中总会有那么一点点的小惊喜.由于公司业务的发展,现在需要本地库中再配置一个sshkey,下面记录下配置的全过程: 生成并添加第一 ...