HDU 4272 LianLianKan (状压DP+DFS)题解
思路:
用状压DP+DFS遍历查找是否可行。假设一个数为x,那么他最远可以消去的点为x+9,因为x+1~x+4都能被他前面的点消去,所以我们将2进制的范围设为2^10,用0表示已经消去,1表示没有消去。dp[i][j]表示栈顶是i当前状态为j时能不能消去栈顶,-1代表不知道,0不行,1行。所以我们只需DFS到i==n时j是否为0,就可以知道能不能消除。更新状态时,只有栈顶到栈底元素>10才更新新的元素进栈。
代码:
#include<cstdio>
#include<map>
#include<set>
#include<queue>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define ll long long
const int maxn = 1 << 10;
const int MOD = 100000000;
const int INF = 0x3f3f3f3f;
using namespace std;
int n,num[maxn];
int dp[maxn][maxn]; //-1不知道,0不能除掉栈顶,1可以除掉栈顶
//0消去,1未消去
int nextsta(int pos,int sta){ //后面数字大于10才有新数字加入
if(n - pos <= 10) return sta >> 1;
else return 1<<9 | sta>>1;
}
int dfs(int pos,int sta){
if(pos == n) return sta == 0;
if(dp[pos][sta] != -1) return dp[pos][sta];
dp[pos][sta] = 0;
if((sta&1) == 0) //已经除掉栈顶了
dp[pos][sta] = dfs(pos + 1,nextsta(pos,sta));
else{
int cnt = 0;
for(int i = 1;i < 10 && cnt < 5;i++){
if(sta&1<<i){
cnt++;
if(num[pos+i] != num[pos]) continue;
int newsta = sta & ~1 & ~(1<<i);
//sta & ~1 => 将栈顶归零
//& ~(1<<i) => 将某位归零
if(dfs(pos + 1,nextsta(pos,newsta))){
dp[pos][sta] = 1;
break;
}
}
}
}
return dp[pos][sta];
}
int main(){
while(~scanf("%d",&n)){
for(int i = n-1;i >= 0;i--)
scanf("%d",&num[i]);
if(n % 2){
printf("0\n");
continue;
}
memset(dp,-1,sizeof(dp));
int ans = dfs(0,(1<<min(10,n)) - 1);
printf("%d\n",ans);
}
return 0;
}
HDU 4272 LianLianKan (状压DP+DFS)题解的更多相关文章
- bjtu 1846. Infinity的装备[状压dp+dfs/bfs]
https://citel.bjtu.edu.cn/acm/oj/problem/1846 1846. Infinity的装备 时间限制 1000 ms 内存限制 64 MB 题目描述 “测试服终于下 ...
- HDU 4272 LianLianKan(状压DP)题解
题意:一个栈,每次可以选择和栈顶一样的数字,并且和栈顶距离小于6,然后同时消去他们,问能不能把所有的数消去 思路:一个数字最远能消去和他相距9的数,因为中间4个可以被他上面的消去.因为还要判断栈顶有没 ...
- 【题解】洛谷P3959 [NOIP2017TG] 宝藏(状压DP+DFS)
洛谷P3959:https://www.luogu.org/problemnew/show/P3959 前言 NOIP2017时还很弱(现在也很弱 看出来是DP 但是并不会状压DP 现在看来思路并不复 ...
- HDU 4628 Pieces(状压DP)题解
题意:n个字母,每次可以删掉一组非连续回文,问你最少删几次 思路:把所有回文找出来,然后状压DP 代码: #include<set> #include<map> #includ ...
- BZOJ-1087 互不侵犯King 状压DP+DFS预处理
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2337 Solved: 1366 [Submit][ ...
- HDU 4284Travel(状压DP)
HDU 4284 Travel 有N个城市,M条边和H个这个人(PP)必须要去的城市,在每个城市里他都必须要“打工”,打工需要花费Di,可以挣到Ci,每条边有一个花费,现在求PP可不可以从起点1 ...
- POJ - 3254 Corn Fields(状压DP)题解
思路: 参照blog,用状压DP做,和题解稍微有点不一样,我这里直接储存了状态而不是索引. 这一题的问题是怎么判断相邻不能种,我们用2进制来表示每一行的种植情况.我们将每一行所能够造的所有可能都打表( ...
- HDU 4336 容斥原理 || 状压DP
状压DP :F(S)=Sum*F(S)+p(x1)*F(S^(1<<x1))+p(x2)*F(S^(1<<x2))...+1; F(S)表示取状态为S的牌的期望次数,Sum表示 ...
- FJNU Fang G and his Friends(状压DP)题解
Description 众所周知,fang G 有很多小伙伴,有一天,Fang G 打算带他们去玩有趣的游戏OOXX,这个游戏需要分成两组,有趣的是,每个人互相之间都有一个满意度,大家都想和自 ...
随机推荐
- Module 'null' not found异常解决办法
百度原因:是因为在 /WEB_INF/web.xml文件中 <servlet> <servlet-name>ActionServlet</servlet-name ...
- bootstrap之辅助类
类 描述 .pull-left 元素浮动到左边 .pull-right 元素浮动到右边 .center-block 设置元素为 display:block 并居中显示 .clearfix 清除浮动 . ...
- chrome inspect 离线调试-工具包 怎么使用
1.找到相关目录: C:\Users\当前用户\AppData\Local\Google\Chrome\User Data\Default 2.找到以下文件夹: 1.Application Cache ...
- rman备份的其它特性
1.7.3.1并发: 主要用于提高备份的速度,可以分为手动并发或自动并发 手动并发:通过分配多个通道并将文件指定到特定的通道 RMAN> run { 2> allocate channe ...
- Linux 安装 MantisBT 详解
https://www.cnblogs.com/qdwyg2013/p/6030157.html 在工作中,选用了MantisBT作为公司的BTS工具.MantisBT的作为一款缺陷跟踪管理系统,有以 ...
- 'Settings' object has no attribute 'TEMPLATE_DEBUG' 的解决方法
找到该Django项目下的settings文件,把 DEBUG = True 改为 DEBUG = False 就可以正常浏览显示了 参考:https://stackoverflow.com/ques ...
- Redis集群管理(二)
1.进入集群客户端 任意选一个redis节点,进入redis 所在目录 cd /redis 所在目录/src/ ./redis-cli -h 本地节点的ip -p redis的端口号 -a 密码 [r ...
- TC/IP协议簇
TCP/IP: 数据链路层:ARP,RARP网络层: IP,ICMP,IGMP传输层:TCP ,UDP,UGP应用层:Telnet,FTP,SMTP,SNMP. OSI:物理层:EIA/TIA-232 ...
- python的tqdm模块
Tqdm 是一个快速,可扩展的Python进度条,可以在 Python 长循环中添加一个进度提示信息,用户只需要封装任意的迭代器 tqdm(iterator). 根据要求安装依赖即可. 可以很方便的在 ...
- drop user 报错ora-00604
问题描述: SQL> show user USER is "SYS" SQL> drop user efmis_zhongyang cascade; drop user ...