题意:

  

如图,一列未知的区域长度为n(≤1000),给出第二列的数字,求区域中雷的排列有多少种。


Solution:

  搜索。这题看上去1000的范围很大,实际上加上合理的剪枝,状态数会变得非常非常少。

一个雷最多能影响3个格子,直接从上往下枚举这个地方有没有雷。有雷的话给影响的格子的数字减一。

出现负数,或枚举到第k个位置了,第k-2个位置的数不为0的时候都是可以退出的。

这样的搜索策略使得我们几乎不会做无用功,最多向下一层就回到了正确的方向。

实际上代码也只用了15ms

#include <iostream>
using namespace std;
int n, ans;
int s[]; void dfs ( int x )
{
if ( x - > && s[x - ] != ) return;
if ( x == n + ) {
if ( s[n] == ) ++ans;
return ;
}
dfs ( x + );
int flag = ;
for ( int i = -; i <= ; ++i ) {
if ( ( x + i > && x + i <= n ) && --s[x + i] < ) flag = ;
}
if ( !flag ) dfs ( x + );
for ( int i = -; i <= ; ++i ) {
if ( x + i > ) ++s[x - i];
}
}
int main()
{
cin >> n;
for ( int i = ; i <= n; ++i ) {
cin >> s[i];
}
dfs ( );
cout << ans << endl;
}

  然而分析复杂度的时候我发现。。。实际上如果我们确定了第一个格子有没有雷,就可以推断出下面所有的情况!

所以只需要枚举第一个格子有没有雷就行了。显然答案的范围也在[0,2]。

  由此可以见上面的搜索算法的时间复杂度其实也是O(n)的。

最新文章

  1. 使用脚本操作UpdatePanel中控件的问题
  2. 控制反转IOC的依赖注入方式
  3. MS对WCF配置中security节点的解释
  4. IOS 网络浅析-(七 JSON解析之三方JSONKit)
  5. MySQL 字符串 转 int/double CAST与CONVERT 函数的用法
  6. PowerDesigner中遍历物理模型中的所有表,检查表代码、字段代码
  7. HDU 1708
  8. OpenStack API 与 CloudStack API 模块比较
  9. Android 布局之LinearLayout 子控件weight权重的作用详析(转)
  10. NYOJ710 外星人的供给站 【贪心】
  11. adapter pattern
  12. NhibernateProfiler-写个自动破解工具(源码)
  13. UVA 10308 Roads in the North
  14. Java进阶(十一)部分数据类型取值范围
  15. Python课程学习总结
  16. Numpy 线性代数
  17. bugku题目“cookie欺骗”
  18. 洛谷 P2774 方格取数问题 解题报告
  19. oracle数据库自增主键重复
  20. javascript基础学习系列-原型链模式

热门文章

  1. 路由器中pppoe,动态IP,静态IP的区别
  2. POJ-3468 A Simple Problem with Integers Splay Tree区间练习
  3. storm-starter项目概述
  4. delphi 默认字体修改
  5. Python队列服务 Python RQ Functions from the __main__ module cannot be processed by workers.
  6. PAT 1034. Head of a Gang (30)
  7. 三目运算符 改变&lt;a&gt;标签的class属性
  8. 设置JVM内存溢出时快照转存HeapDump到文件
  9. Ubuntu下开启root登陆
  10. Redis学习手册(Set数据类型)