UVA10118_Free Candies状态压缩
这题大概题意是,有四列糖果,一个人手中最多拿五个水果,每次拿水果只能从每一列最上面开始拿.
而如果手中的糖果相同就会成对抵消,奖励给玩家
问玩家怎样取能取到最多的糖果,并输出对数
这题是运用动态规划,那么开始应该怎样建立状态呢
状态必须包括足够多的信息以至于能够转移,显然其中一个信息就是手中有哪些糖果,而为了能够进行转移我们还要知道当前每列糖果的局面,所以我建立了一个四维的数组,每一维表示该列已经取了多少个糖果
其实当四维数组确定下来后,取糖果取到这种局面那么手中还剩的糖果局面也是确定的,只是求比较麻烦,所以需要单独表示出来
这里用状态压缩来保存手中糖果信息,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状态压缩的更多相关文章
- POJ 3254. Corn Fields 状态压缩DP (入门级)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9806 Accepted: 5185 Descr ...
- HDU 3605:Escape(最大流+状态压缩)
http://acm.hdu.edu.cn/showproblem.php?pid=3605 题意:有n个人要去到m个星球上,这n个人每个人对m个星球有一个选择,即愿不愿意去,"Y" ...
- [HDU 4336] Card Collector (状态压缩概率dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336 题目大意:有n种卡片,需要吃零食收集,打开零食,出现第i种卡片的概率是p[i],也有可能不出现卡 ...
- HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)
题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...
- codeforces B - Preparing Olympiad(dfs或者状态压缩枚举)
B. Preparing Olympiad You have n problems. You have estimated the difficulty of the i-th one as inte ...
- NOIP2005过河[DP 状态压缩]
题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...
- vijos1426兴奋剂检查(多维费用的背包问题+状态压缩+hash)
背景 北京奥运会开幕了,这是中国人的骄傲和自豪,中国健儿在运动场上已经创造了一个又一个辉煌,super pig也不例外……………… 描述 虽然兴奋剂是奥运会及其他重要比赛的禁药,是禁止服用的.但是运动 ...
- hoj2662 状态压缩dp
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
- poj3254 状态压缩dp
题意:给出一个n行m列的草地,1表示肥沃,0表示贫瘠,现在要把一些牛放在肥沃的草地上,但是要求所有牛不能相邻,问你有多少种放法. 分析:假如我们知道第 i-1 行的所有的可以放的情况,那么对于 ...
随机推荐
- Java并发AtomicLong接口
java.util.concurrent.atomic.AtomicLong类提供了可以被原子地读取和写入的底层long值的操作,并且还包含高级原子操作. AtomicLong支持基础long类型变量 ...
- go语言统计字符个数
具体代码如下: package main import "fmt" func main() { m := make(map[rune]int, 1) var input strin ...
- PHP 接口签名验证
目录 概览 常用验证 单向散列加密 对称加密 非对称加密 密钥安全管理 接口调试工具 在线接口文档 扩展 小结 概览 工作中,我们时刻都会和接口打交道,有的是调取他人的接口,有的是为他人提供接口,在这 ...
- 解决 Failed to load class "org.slf4j.impl.StaticLoggerBinder"
我们在使用日志记录网站或者应用时,有时候启动会出现这个告警: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder&q ...
- Tkinter初体验
一.基本步骤 1.导入Tkinter模块 2.创建根窗口 3.填充组件 4.组件关联逻辑 5.进入主循环 二.Code #coding:utf-8 ''' 网关流量校验器 @author: Hongz ...
- springboot 2.x相关配置
1.在配置文件中进行配置 #############指定项目中所有的日期类型返回json格式########### spring.jackson.date-format=yyyy-MM-dd HH:m ...
- web之请求转发与重定向
请求转发: 重定向:
- JavaSE---多线程---线程的控制
1.Java提供了一些工具方法,可以便捷控制线程的执行: 1.1 join Thread提供了让一个线程等待另一个线程执行完成的方法:join: 当某个程序的执行流中调用其他线程的join方法,该线程 ...
- Windows10 通用快捷键命令
总想着甩掉鼠标,来一种只用键盘的各种行云流水般的快捷操作,在网上各个论坛,博客,搜索引擎,最后终于记录整理了出来! 为了尝试新的命令提示符下,只需 打开开始菜单,然后键入cmd并回车. 按Ct ...
- php str_shuffle()函数 语法
php str_shuffle()函数 语法 str_shuffle()函数怎么用? php str_shuffle()函数用于随机的打乱字符串中所有字符,语法是str_shuffle(string) ...