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 行的所有的可以放的情况,那么对于 ...
随机推荐
- 常用开发类库支持--UUID及空值处理Optional
一.java常用类库--UUID --UUID类库的使用非常简单,只需要使用静态方法UUID.randomUUID(就可以正常使用) public class MyUUID { public stat ...
- 【Python—字典的用法】找到多个字典的公共键
有 a,b,c,d,e,f 6名球员,他们在三轮比赛中的进球数用 s1,s2,s3 3个字典表示,找到每轮都有进球的球员? 创建 s1,s2,s3 3个字典素材 from random import ...
- 什么是Kotlin?Java的替代语言?
什么是Kotlin Kotlin是一个基于JVM的新的编程语言,2010年由IntelliJ IDEA所在的JetBrains公司开发,自2012年以来一直开源. Kotlin可以编译成Java字节码 ...
- POJ 2412 /// 空间几何 经纬度转三维坐标 角度转弧度 法向量
题目大意: 给定半径6378km的球上的 多个地点 及其 经纬度 多个询问 给定三个地点 A B C A与B的等距点在球上形成一个大圆 即球面上有一个到两点距离相等的大圆 且大圆所在平面垂直两点连线 ...
- js 模拟window.open 打开新窗口
为什么要去模拟window.open() 打开一个 新的窗口呢,因为有些浏览器默认会拦截 window.open, 当需要函数中打开新窗口时,接可以使用a标签去模拟打开. /** * a模拟windo ...
- c# 使用网站的身份验证及 Cookie 的获取与使用
C# 的 Http 访问可以使用 .net 自带的 HttpWebRequest, WebClient, HttpClient 类.也可以使用开源库 RestSharp . RestSharp 的优 ...
- STM8硬件设计注意事项
1.中断 STM8的外部中断和STM32不一样,每个端口PX只有1个中断 2.ADC 1)Additional AIN12 analog input is not selectable in ADC ...
- zxing opencv
- ivew Upload 上传时附带的额外参数
<Upload action="/api/device/importData" :data="uploadData" :before-upload=&qu ...
- BioGRID 互作数据库
01 — BioGRID BioGRID 是 Biological General Repository for Interactionh Datasets 的缩写(网址为 https://thebi ...