这题大概题意是,有四列糖果,一个人手中最多拿五个水果,每次拿水果只能从每一列最上面开始拿.

而如果手中的糖果相同就会成对抵消,奖励给玩家

问玩家怎样取能取到最多的糖果,并输出对数

这题是运用动态规划,那么开始应该怎样建立状态呢

状态必须包括足够多的信息以至于能够转移,显然其中一个信息就是手中有哪些糖果,而为了能够进行转移我们还要知道当前每列糖果的局面,所以我建立了一个四维的数组,每一维表示该列已经取了多少个糖果

其实当四维数组确定下来后,取糖果取到这种局面那么手中还剩的糖果局面也是确定的,只是求比较麻烦,所以需要单独表示出来

这里用状态压缩来保存手中糖果信息,s的二进制表示手中糖果信息

下面给出代码

//  Created by Zeroxf on 2015-08-11-14.23
// Copyright: (c) 2015 Zeroxf. All rights reserved
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include <bitset>
using namespace std;
const int maxn = 43;
int d[maxn][maxn][maxn][maxn],height,t,a[maxn][5],h[4];;
int dfs(int s){
int &ans = d[h[0]][h[1]][h[2]][h[3]];
if(ans >= 0) return ans;
//判断s的二进制中有多少个1,也就是有多少个糖果
int num = __builtin_popcount(s);
if(num>=5) return ans = 0;
ans = 0;
//枚举四列递归下去求最多糖果树,回溯法
for(int i=0;i<4;i++){
if(h[i]>=height) continue;
int &x=a[h[i]][i];
//当取到x号糖果时候,手中有
if(s>>x&1){
h[i]++;
ans = max(dfs(s^(1<<x))+1,ans);
h[i]--;
}
else{
h[i]++;
ans = max(dfs(s|(1<<x)),ans);
h[i]--;
}
}
return ans;
}
int main(){
while(cin>>height&&height){
memset(d,-1,sizeof d);
memset(h,0,sizeof h);
for(int i=0;i<height;i++){
for(int j=0;j<4;j++)
cin>>a[i][j];
}
cout<<dfs(0)<<endl;
}
return 0;
}

UVA10118_Free Candies状态压缩的更多相关文章

  1. POJ 3254. Corn Fields 状态压缩DP (入门级)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9806   Accepted: 5185 Descr ...

  2. HDU 3605:Escape(最大流+状态压缩)

    http://acm.hdu.edu.cn/showproblem.php?pid=3605 题意:有n个人要去到m个星球上,这n个人每个人对m个星球有一个选择,即愿不愿意去,"Y" ...

  3. [HDU 4336] Card Collector (状态压缩概率dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336 题目大意:有n种卡片,需要吃零食收集,打开零食,出现第i种卡片的概率是p[i],也有可能不出现卡 ...

  4. HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)

    题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...

  5. codeforces B - Preparing Olympiad(dfs或者状态压缩枚举)

    B. Preparing Olympiad You have n problems. You have estimated the difficulty of the i-th one as inte ...

  6. NOIP2005过河[DP 状态压缩]

    题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...

  7. vijos1426兴奋剂检查(多维费用的背包问题+状态压缩+hash)

    背景 北京奥运会开幕了,这是中国人的骄傲和自豪,中国健儿在运动场上已经创造了一个又一个辉煌,super pig也不例外……………… 描述 虽然兴奋剂是奥运会及其他重要比赛的禁药,是禁止服用的.但是运动 ...

  8. hoj2662 状态压缩dp

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

  9. poj3254 状态压缩dp

    题意:给出一个n行m列的草地,1表示肥沃,0表示贫瘠,现在要把一些牛放在肥沃的草地上,但是要求所有牛不能相邻,问你有多少种放法.     分析:假如我们知道第 i-1 行的所有的可以放的情况,那么对于 ...

随机推荐

  1. js 使用技巧

    一,获取客户端状态 1.获取cookie function cookieInfo() { setcookie('cookie_test','1'); var cookie_test = getcook ...

  2. VB - 操作符(含Is)

    在VBScript运算符中,加减乘除都是我们常用的符号,乘方使用的是 ^ ,取模使用的Mod. 在比较操作符中,等于.小于.大于.小于等于.大于等于都与我们常用的符号是一致的,而不等于是小于和大于连用 ...

  3. MFC坐标问题

    页面空间中的矩形被称为窗口,设备空间中的矩形被称为视口. 页面空间与设备空间的转换示意图: 页面空间到设备空间的转换需要两个矩形的宽高比(转换因子). 设备空间到物理空间转换的唯一作用是平移,并由Wi ...

  4. Linux查看软件安装路径,和文件的位置

    查看软件是否安装:rpm -qa|grep xx 列出软件安装包安装的文件:rpm -ql 直接使用rpm -qal |grep mysql 查看mysql所有安装包的文件存储位置 通过find去查找 ...

  5. Neo4j查询节点间最短路径

    Neo4j最短路径问题 1.指定某一结点 无向边: MATCH (p1:Person {name:"aaaaaaa"}),(p2:Person{name:"bbbbbb& ...

  6. 编译Linux-2.6.23内核中遇见的错误

    编译linux-2.6.23 错误[1]: elf_x86_64: 没有那个文件或目录 原因是 gcc 4.6 不再支持 linker-style 架构.在 arch/x86/vdso/Makefil ...

  7. 简述IOC和AOP的作用

    IOC: 控制反转,是一种设计模式.一层含义是控制权的转移:由传统的在程序中控制依赖转移到由容器来控制:第二层是依赖注入:将相互依赖的对象分离,在spring配置文件中描述他们的依赖关系.他们的依赖关 ...

  8. pychrm和linux进行链接上传代码

    众享周知:现在在windows文件中我们有pycharm工具帮我们去编辑python脚本,这会省去我们大把的时间让我们进行更多的脚本编辑.有这样的一种方法,我们可以使用pycharm编辑的脚本上传到l ...

  9. nginx的原理

    Nginx会按需同时运行多个进程:一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程 (cache loader)和缓存管理器进程(cache manager) ...

  10. 愚蠢的sql语法错误(sum (xxx))

    sum和()之间打了一个空格,导致一致报sql语法错误,看了半天不知道怎么回事orz