题意:长度为n(n<=1000)的栈,栈顶元素可以与下面1~5个数中相同的元素消去,问最后能都完全消去。

题解:

比如这个序列
1
2
3
4
5
6
7
8
9
10
11
2这个位置的最远可匹配位置能到11
为什么呢?
因为1这个位置可以匹配到6,那也就是说3、4、5、6这几个位置都可能被上面的匹配过(我写的序列肯定不够,将就一下)
那么剩下的序列就变成了
2
7
8
9
10
11
这样的话2的最远匹配距离就是11了
所以我们要保存至少9个位置的状态,因为我们只需要确保这个位置的数是否呗抵消过
所以我们可以用1代表这个位置的数已经被抵消了,0代表没有被抵消
然后把这九个状态当作二进制形式,然后就被压缩成了一个int大小数字
所以最开始状态就是dp[0][0]=1
dp[i][j]的值代表距离栈顶i-1的那个位置的数是否被抵消,是1代表被抵消了,是0代表没有抵消
dp[0][0]的设定只是为了下面程序的运行
因为题目保证首先要抵消栈顶的元素,所以我们每给dp[i][]赋值的时候必须要确保,dp[i-1][]某个位置的值是1
具体看代码
 
 
代码:
 1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 typedef long long ll;
6 using namespace std;
7 const int maxn=1005;
8 const int M=1<<9;
9 int v[maxn],dp[maxn][1<<9];
10 int main()
11 {
12 int n;
13 while(~scanf("%d",&n))
14 {
15 memset(dp,0,sizeof(dp));
16 for(int i=n;i>0;--i)
17 scanf("%d",&v[i]);
18 dp[0][0]=1;
19 for(int i=1;i<=n;++i)
20 {
21 for(int j=0;j<M;++j)
22 {
23 if(dp[i-1][j]) //因为题目说明要先抵消栈顶的元素,所以每一次寻找都要找到上一个元素被抵消的位置
24 {
25 if(j&1) //这个判断是用来判断这个位置的数字是不是被它上一个位置消掉了
26 {
27 dp[i][j>>1]=1; //因为j这个状态压缩的是它下面10个位置的状态,所以j>>1就完了
28 }
29 else
30 {
31 int t=0; //记录这个位置实际上下沉了几个位置
32 for(int k=1;k<=8;++k)
33 {
34 if(!(j&(1<<k)) && k-t<=5 && v[i]==v[i+k])
35 {
36 dp[i][(j>>1)|(1<<(k-1))]=1;
37 }
38 else if(j&(1<<k))
39 t++;
40 }
41 }
42 }
43 }
44 }
45 if(dp[n][0]==1)
46 printf("1\n");
47 else printf("0\n");
48 }
49 return 0;
50 }

LianLianKan HDU - 4272 状压dp的更多相关文章

  1. HDU 4778 状压DP

    一看就是状压,由于是类似博弈的游戏.游戏里的两人都是绝对聪明,那么先手的选择是能够确定最终局面的. 实际上是枚举最终局面情况,0代表是被Bob拿走的,1为Alice拿走的,当时Alice拿走且满足变换 ...

  2. HDU 3001 状压DP

    有道状压题用了搜索被队友骂还能不能好好训练了,, hdu 3001 经典的状压dp 大概题意..有n个城市 m个道路  成了一个有向图.n<=10: 然后这个人想去旅行.有个超人开始可以把他扔到 ...

  3. hdu 2809(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2809 思路:简单的状压dp,看代码会更明白. #include<iostream> #in ...

  4. hdu 2167(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2167 思路:经典的状压dp题,前后,上下,对角8个位置不能取,状态压缩枚举即可所有情况,递推关系是为d ...

  5. Engineer Assignment HDU - 6006 状压dp

    http://acm.split.hdu.edu.cn/showproblem.php?pid=6006 比赛的时候写了一个暴力,存暴力,过了,还46ms 那个暴力的思路是,预处理can[i][j]表 ...

  6. hdu 3254 (状压DP) Corn Fields

    poj 3254 n乘m的矩阵,1表示这块区域可以放牛,0,表示不能,而且不能在相邻的(包括上下相邻)两个区域放牛,问有多少种放牛的方法,全部不放也是一种方法. 对于每块可以放牛的区域,有放或者不放两 ...

  7. HDU 5823 (状压dp)

    Problem color II 题目大意 定义一个无向图的价值为给每个节点染色使得每条边连接的两个节点颜色不同的最少颜色数. 对于给定的一张由n个点组成的无向图,求该图的2^n-1张非空子图的价值. ...

  8. hdu 4739 状压DP

    这里有状态压缩DP的好博文 题目:题目比较神,自己看题目吧 分析: 大概有两种思路: 1.dfs,判断正方形的话可以通过枚举对角线,大概每次减少4个三角形,加上一些小剪枝的话可以过. 2.状压DP,先 ...

  9. Travel(HDU 4284状压dp)

    题意:给n个城市m条路的网图,pp在城市1有一定的钱,想游览这n个城市(包括1),到达一个城市要一定的花费,可以在城市工作赚钱,但前提有工作证(得到有一定的花费),没工作证不能在该城市工作,但可以走, ...

随机推荐

  1. 【JS学习】数组过滤方法的使用filter

    前言:本博客系列为学习后盾人js教程过程中的记录与产出,如果对你有帮助,欢迎关注,点赞,分享.不足之处也欢迎指正,作者会积极思考与改正. 使用效果: 可以返回参数函数为真的值 //情景:实现从stu数 ...

  2. 基于Python开发数据宽表实例

    搭建宽表作用,就是为了让业务部门的数据分析人员,在日常工作可以直接提取所需指标,快速做出对应专题的数据分析.在实际工作中,数据量及数据源繁多,如果每个数据分析人员都从计算加工到出报告,除了工作效率巨慢 ...

  3. 【Spring】IoC概述

    Spring框架的核心概念--IoC IoC IoC是Inversion of Control的简写,翻译成汉语就是"控制反转".IoC并不是一门技术,而是一种设计思想,在Spri ...

  4. 【Linux】linux的所有文件分类解析

    今天看书的时候,无意间看到/dev/文件夹,以前没注意,今天去看了下发现,很多文件的开头文件属性都是一些不怎么见到的 常见的是   -     这个是代表文件,可以vim编辑的 d     这个是代表 ...

  5. SDUST数据结构 - chap8 查找

    选择题: 函数题: 6-1 二分查找: 裁判测试程序样例: #include <stdio.h> #include <stdlib.h> #define MAXSIZE 10 ...

  6. Nginx和Tomcat配置SSL实现https访问

    环境:CentOS 7 Nginx版本: nginx/1.18.0 1. 安装nginx 详细步骤可以参考如下官网:http://nginx.org/en/linux_packages.html#RH ...

  7. python3.8.1安装cx_Freeze

    按照官网的提示命令python -m pip install cx_Freeze --upgrade安装,不成功,报了一个错误,说cx_Freeze找不到需要的版本,还有一些警告说PIP需要升级,没理 ...

  8. php 换行符

    PHP 中换行可以用 PHP_EOL 来替代,以提高代码的源代码级可移植性: unix系列用 \n windows系列用 \r\n mac用 \r 总结:在一些大文本域中换行的文本可以用这个来进行切割 ...

  9. ObjectMapper将josn字符串转化为List

    一.利用ObjectMapper将json字符串转为List Student.java package objectmapper; import java.io.Serializable; publi ...

  10. [Usaco2007 Jan]Telephone Lines架设电话线

    题目描述 FarmerJohn打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用.FJ的农场周围分布着N(1<=N<=1,000)根 ...