题目大意:有一列数据,可以从最上面的开始连接下面相同的元素,然后消除,不过距离不能超过6,询问最后能不能消除完整个数列。

分析:首先讨论一点最远能消除的地方,比如点的位置是x,如若想要消除x+1位置处的值,那么至少也得在x-4处开始消除,所以x后面最多能有4个被消除,也就是最多能下落4个位置,能够消除的最远距离是x+9,不会超过10个状态,所以可以使用状态压缩做,不过有几点还是要注意的,首先输入的数据是从栈底到栈顶的,其次,判断状态的能否达到的时候要注意判断中间有多少个已经被消除的。

代码如下:

======================================================================================================================

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std; const int MAXN = <<;
const int bit = ; int data[MAXN];
bool dp[MAXN][MAXN]; int main()
{
int i, j, k, N; while(scanf("%d", &N) != EOF)
{
memset(data, -, sizeof(data));
memset(dp, , sizeof(dp)); for(i=N; i>; i--)
{
scanf("%d", &data[i]);
} dp[][] = true; for(i=; i<=N; i++)
for(j=; j<MAXN; j++)
{
if(dp[i-][j] == true)
{///这种状态存在
if(j & )
{///本位已经被消除
dp[i][j>>] = true;
}
else
{
int t = ;///纪录已经被消除的,状态1表示被消除,0表示没有 for(k=; k<=bit; k++)
{
if(!(j&(<<k)) && k-t <= &&data[i] == data[i+k])
{///可以消除,两者之间的距离应该不超过6
dp[i][(j>>)|(<<(k-))] = true;
}
else if(j & (<<k))
t++;
}
}
}
} if(dp[N][] == true)
printf("1\n");
else
printf("0\n");
} return ;
}

最新文章

  1. mysql, count函数容易曲解的地方
  2. Autofac的高级使用——Autofac.2.6.3.862
  3. SpringMVC中向服务器传递时间参数时出现的问题
  4. Round robin
  5. Hbase之使用多Get实例返回数据
  6. bug_ _ _android.app.Fragment$InstantiationException 解决办法
  7. Oracle 经典语法(四)
  8. PHP 正则表达式替换一部分内容
  9. java开发之匿名内部类,接口的使用
  10. C# 判断路径是否存在
  11. hibernate性能消耗太狠了。果断减肥引发的连串意外惊喜
  12. Android URI简介
  13. C#性能优化实践【转】
  14. VirtualBox 中ubuntu访问window下共享目录
  15. 翻译 异步I/O不会创建新的线程
  16. poj1151 Atlantis (线段树+扫描线+离散化)
  17. [NIO-1]缓冲区
  18. HDU 1575 Tr A(矩阵高速幂)
  19. IntelliJ IDEA 13.1.3 SVN无法正常使用问题
  20. URL去重

热门文章

  1. IOS-objectForKey与valueForKey在NSDictionary中的差异
  2. wireshark添加用户执行
  3. 前端开发bower包管理器
  4. java-成员变量的属性与成员函数的覆盖
  5. ACM YTU 挑战编程 字符串 Problem A: WERTYU
  6. jquery text--val--html
  7. 跟我玩ADB——初识ADB
  8. cmd 窗口的复制粘贴
  9. tar、zip 、unzip 打包与压缩 (参考:http://pengyl.blog.51cto.com/5591604/1191197)
  10. 请大神帮忙解决 jquery 控制 li 标签问题