hdu 4620 Fruit Ninja Extreme(状压+dfs剪枝)
对t进行从小到大排序(要记录ID),然后直接dfs。
剪枝的话,利用A*的思想,假设之后的全部连击也不能得到更优解。
因为要回溯,而且由于每次cut 的数目不会超过10,所以需要回溯的下标可以利用一个二进制保存。
由于cut最多30个,所以方案也可以用一个二进制保存。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<stack>
using namespace std;
bool vis[205];
struct node
{
int t;
int f[205];
int top;
int id;
}cut[205];
int n,m,w,ans;
int p;
int ansp;
bool cmp(const node &a,const node &b)
{
return a.t<b.t;
}
void dfs(int now,int score)
{
if(n-now+score<=ans) return; for(int i=now+1;i<=n;i++)
{
int aa=0;
if(cut[i].top<3) continue;
if(cut[i].t-cut[now].t>w&&score) break;
int tot=0;
for(int j=1;j<=cut[i].top;j++)
if(!vis[cut[i].f[j]]) vis[cut[i].f[j]]=1,aa|=(1<<(j-1)),tot++;
if(tot>=3)
{
p|=(1<<(cut[i].id-1));
dfs(i,score+1);
p&=(~(1<<(cut[i].id-1)));
}
int tt=1;
while(aa)
{
if(aa&1)
{
vis[cut[i].f[tt]]=0;
}
aa>>=1;
tt++;
}
}
if(score>ans)
{
ans=score;
ansp=p;
}
}
int main()
{
int cas;
scanf("%d",&cas);
while(cas--)
{
scanf("%d%d%d",&n,&m,&w);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&cut[i].top,&cut[i].t);
cut[i].id=i;
for(int j=1;j<=cut[i].top;j++)
scanf("%d",&cut[i].f[j]);
}
p=0;
ans=0;
memset(vis,false,sizeof(vis));
sort(cut+1,cut+n+1,cmp);
dfs(0,0);
printf("%d\n",ans);
int tt=1;
while(ansp)
{
if(ansp&1) {
if(tt==1) printf("%d",tt);
else printf(" %d",tt);
}
ansp=(ansp>>1);
tt++;
}
printf("\n");
}
}
hdu 4620 Fruit Ninja Extreme(状压+dfs剪枝)的更多相关文章
- hdu 4620 Fruit Ninja Extreme
Fruit Ninja Extreme Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- HDU 4620 Fruit Ninja Extreme 搜索
搜索+最优性剪枝. DFS的下一层起点应为当前选择的 i 的下一个,即DFS(i + 1)而不是DFS( cur + 1 ),cur+1代表当前起点的下一个.没想清楚,TLE到死…… #include ...
- HDU 4620 Fruit Ninja Extreme(2013多校第二场 剪枝搜索)
这题官方结题报告一直在强调不难,只要注意剪枝就行. 这题剪枝就是生命....没有最优化剪枝就跪了:如果当前连续切割数加上剩余的所有切割数没有现存的最优解多的话,不需要继续搜索了 #include &l ...
- HDU 4620 Fruit Ninja Extreme 暴搜
题目大意:题目就是描述的水果忍者. N表示以下共有 N种切水果的方式. M表示有M个水果需要你切. W表示两次连续连击之间最大的间隔时间. 然后下N行描述的是 N种切发 第一个数字C表示这种切法可以切 ...
- hdu 4000 Fruit Ninja 树状数组
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4000 Recently, dobby is addicted in the Fruit Ninja. ...
- HDU 4000 Fruit Ninja 树状数组 + 计数
给你N的一个排列,求满足:a[i] < a[k] < a[j] 并且i < j < k的三元组有多少个. 一步转化: 求出所有满足 a[i] < a[k] < a[ ...
- hdu4620 Fruit Ninja Extreme
Fruit Ninja Extreme Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- ZOJ 1609 Equivalence(状压+dfs减枝)
ZOJ Problem Set - 1609 Equivalence Time Limit: 5 Seconds Memory Limit: 32768 KB When learning m ...
- bzoj1725: [Usaco2006 Nov]Corn Fields牧场的安排(状压dfs)
1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1122 Solved: 80 ...
随机推荐
- 关于WEB三层架构的思考
1.MVC设计思想 MVC程序设计思想是眼下比較流行的WEB开发的模式,当中,M(model)是模型.即JavaBean,用来封装和保存数据:V(view)是视图,即JSP.用来显示内容:C(cont ...
- Servlet配置对象、上下文对象、多线程问题
一.Servlet配置对象(ServletConfig):Servlet初始化时,容器调用其init(ServletConfig)方法,传递该对象. 1.获得对象方法: (1).直接使用getServ ...
- Windows通过远程桌面访问Ubuntu
关于Windows通过远程桌面访问Ubuntu 问题及目标 Window环境通过远程桌面访问Ubuntu Ubuntu机器端 1. 安装所需软件包 sudoapt-get install x ...
- 强化一下开源库:Synopse
http://synopse.info/fossil/wiki/Synopse+OpenSource 有空要研究一下,只有写在这里,才会时时刻刻提醒自己.
- spring mvc MultipartFile 上传文件错误解决
Field error in object 'xxxx' on field 'xxxx': rejected value [20129259128131.jpg]; codes [typeMismat ...
- 基于visual Studio2013解决面试题之0701寻找丑数
题目
- 性能测试之LoardRunner 手动关联一
概述: 1.什么是关联,关联的分类? 2.实例讲解 1.关联 为什么要关联?关联是应用LoadRunner进行性能测试的一项重要技能,那为什么我们要进行关联呢?当利用VuGen录制脚本时,它会拦截Cl ...
- 简单的javascript抽奖程序
<html> <head> <title>手机号码抽奖程序</title> <script> //声明一个数组装住号码,可根 ...
- UVA 644 Immediate Decodability (字符处理)
An encoding of a set of symbols is said to be immediately decodable if no code for one symbol is the ...
- Android 通过广播来异步更新UI
之前的项目里要做一个异步更新UI的功能,可是结果出现了ANR,所以想写个demo来測试究竟是哪个地方出现了问题,结果发现原来的思路是没有问题,郁闷~~ 如今这个demo 就是模拟项目里面 的步骤 1. ...