文章目录

  • 问题
  • 小白的代码
    • 二进制模拟
  • 大佬的码
    • 思路分析
    • 代码实现
  • 另一份代码
    • 分析
    • 大佬代码又又又来了

问题

1212: 核电站问题
时间限制: 1 Sec 内存限制: 128 MB
提交: 725 解决: 435

一个核电站有N个放核物质的坑,坑排列在一条直线上。如果连续3个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质。现在,请你计算:对于给定的N,求不发生爆炸的放置核物质的方案总数。

输入
输入文件只有多行,每行对应一个正整数N<=40;

输出
输出文件有多行,每行只有一个正整数,表示方案总数

样例输入 Copy
1
2
3
4
10
样例输出 Copy
2
4
7
13
504

小白的代码

二进制模拟

我自己用的方法,折腾了三个多小时!!!
n个坑,当成n个二进制位
放弹为1,不放蛋为0

#include <iostream>
#include <cmath>
using namespace std;int main() {int N;int cnt; // 符合要求的二进制数int rep = 0; // 用一个数的二进制 0 和 1 的情况来模拟有无放核弹, rep来记录连续的 1 的个数while(cin >> N) {cnt = 0; // int num;int findThreeBomb;int bitDigi;// int index; // 使用滑动窗口,检测一个窗口里的3个坑是否都是1num = pow(2, N); // N 个二进制坑都装了1,代表的值为 pow(2, N + 1) - 1for (int j = 0; j < num; j++) {// rep = 0;findThreeBomb = 0; // 标记 3 个连续 1// index = -1;bitDigi = 7; // 初始化for (int i = 0; i < N; i++) { if (i > 2) bitDigi = (7 << (i - 2)); // 3 个 111(对应10进制中的7) else bitDigi = 7; // 前三位不用移动用来检测的 bitDigi//if ((j & bitDigi) % 7 == 0 && (j & bitDigi) != 0) { // 如果 j 的第 i 位也为 1, 则(j & bitDigi)一定 >= 1// 重点分界线!!!,上边的 (j & bitDigi) 非常重要if (j >= 7 && (j & bitDigi) != 0 && (j & bitDigi) % 7 == 0) // 至少有三个坑被填满,也就是111(2),才有可能// 所以必须 j 大于等于7, 能被7整除的除了 111(2)× 2 ^N, 0也能被七整除,所以(j & bitDigi) != 0(排除检测到都是 0 的情况){//cout << "j = " << j << "\tbitDig = " << bitDigi << endl;findThreeBomb = 1;break;// if (i > 2) {//     //j & bitDigi & (1 << (i - 3))// }// cout << "j = " << j << "\tbitDig = " << bitDigi << endl;// ++rep;// cout << "rep = " << rep << endl;// if (rep == 3) {//     // cout << "rep = " << rep << endl;//     findThreeBomb = 1;//     break;// }                    }}if (findThreeBomb == 0) cnt++; // 这个01序列(每个0和1对应着有无核弹),符合要求,没有3个连续的1}cout << cnt << endl; }return 0;
}

大佬的码

思路分析


f(n-1) 代表第n个位置不放弹时的f(n)的解决方案(也代表前 n-1 项的情况),也就是说 f(n)在不放弹的情况下的符合要求的方案数和f(n -1)相同。
还要再加上放弹的情况,这个就要考虑具体的第 n-1 个位置的情况…

那么n-1又分放与不放,不放,则与f(n-2)相同,放了的话…

代码实现

#include <iostream>
using namespace std;int main()
{int arr[50];arr[1] = 2 ;arr[2] = 4 ;arr[3] = 7 ;for(int i = 4; i <= 40; i++){arr[i] = arr[i-1] + arr[i-2] + arr[i-3];}int n;while (cin >> n) {cout << arr[n] << endl;}return 0;
}

另一份代码

分析

题目分析:动态规划(DP)个人现在的理解为:
通过数组的形式记录所求状态,
对一类可以进行状态累积的问题,
通过记录其变化而求解。
主要是对状态转移方程的求出。
此题的状态转移方程为:
dp[0] = 1;
dp[i] = dp[i-1]*2;(i < m)
dp[i] = dp[i-1]*2-1;(i = m)
dp[i] = dp[i-1]*2-dp[i-m-1];(i > m)
此题的m为3。dp[i] = dp[i-1]*2 - dp[i-m-1];(i > m)
这句最关键。
dp[i-1]*2包含了第i-1, i-2, i-3,..., i-m项中有放了核弹的情况,
(甚至全部都放了核弹,而这显然不符合要求必须要减去)
这种情况是发生在dp[i-m-1]后,
在确定情况下,这种错误情况(连续的m放)也确定下来了,
也是等于dp[i-m-1].i>m时,dp[i]=2*dp[i-1]-dp[i-m-1]
这是最难理解的部分,因为无论i-m-1的情况是什么,
它后面都可以接i-m到i是放的情况(但是连续m放是不符合题意的)。
根据最优结构,这种情况需要排除,
而这种错误情况是建立在dp[i-m-1]一种确定情况,
即等同于减去dp[i-m-1]。

大佬代码又又又来了

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cstring>
#include <string>
#include <map>
#include <queue>
#define N 2000
#define INF 1 << 30
using namespace std;typedef long long LL;int main()
{LL dp[50];int i, m, n;dp[0] = 1;m = 3;for (i = 1; i <= n; i++){if (i < m)dp[i] = 2 * dp[i - 1];if (i == m)dp[i] = 2 * dp[i - 1] - 1;if (i > m)dp[i] = 2 * dp[i - 1] - dp[i - m - 1];}while (~scanf("%d", &n))cout << dp[n] << endl;return 0;
}

1212: 核电站问题动态规划等多种方法(以及二进制模拟)相关推荐

  1. 1212: 核电站问题

    1212: 核电站问题 时间限制: 1 Sec  内存限制: 128 MB 提交: 395  解决: 274 [提交][状态][讨论版][命题人:外部导入] 题目描述 一个核电站有N个放核物质的坑,坑 ...

  2. PHP 中提示undefined index如何解决(多种方法)

    PHP 中提示undefined index如何解决(多种方法) 参考文章: (1)PHP 中提示undefined index如何解决(多种方法) (2)https://www.cnblogs.co ...

  3. c# asp.net core取当月第一天和最后一天及删除最后一个字符的多种方法

    当月第一天0时0分0秒 DateTime.Now.AddDays(1 - DateTime.Now.Day).Date 当月最后一天23时59分59秒 DateTime.Now.AddDays(1 - ...

  4. python怎么读文件内容-Python读取文件内容为字符串的方法(多种方法详解)

    以下笔记是我在 xue.cn 学习群之数据分析小组所整理分享的心得.相关背景是:我选择中文词频统计案例作为考察大家python基础功掌握程度. 以小见大,下面是2个小技能的具体实战: 如何灵活地处理文 ...

  5. 多种方法教你破解电信共享上网的限制

    现在很多家庭都有不止一台电脑,多台电脑要实现共享上网,以前大家一般都是通过路由器来实现多台电脑共享上网,但是随着宽带用户的增加,各地的电信开始纷纷封杀家庭用户的多机共享上网,让不少消费者伤透了头脑,难 ...

  6. 接口里面的方法都是抽象方法吗_单元格区域选取,竟然有这么多种方法,你都造吗?...

    在日常工作中, 怎么能少了Excel表格,相信我,如果你能把Excel用到极致,工作效率可是瞬间提升的,当然,可能还附带升职加薪哟! 关于单元格及单元格区域的选取可以说是Excel中最基本的操作之一, ...

  7. 多种方法巧妙优化数据库

    多种方法巧妙优化数据库 日期:2011/12/24 16:18:01  来源:本站 点击率:330 我要评论(0)字号:T T T        1.没有索引或者没有用到索引(这是查询慢最常见的问题, ...

  8. html下拉框变长,改变HTML下拉框SELECT选项的多种方法

    原标题:改变HTML下拉框SELECT选项的多种方法 提交表单后返回的HTML页面重新渲染,SELECT控件的value和selectedIndex属性都无法使下拉框保留提交表单前的状态. 复制代码 ...

  9. SQL语句的添加、删除、修改多种方法

    SQL语句的添加.删除.修改多种方法 SQL语句的添加.删除.修改虽然有如下很多种方法,但在使用过程中还是不够用,不知是否有高手把更多灵活的使用方法贡献出来? 添加.删除.修改使用db.Execute ...

最新文章

  1. azure mysql 只读节点_Azure MySQL PaaS 创建MySQL异地只读数据库 (Master-Slave)
  2. 听说你想去大厂看妹子,带你看看字节跳动数据挖掘面试是啥样?
  3. 华为云——给【服务器】一个温暖的家
  4. djongo mysql 回滚_django事物回滚
  5. 中控ecs700 mysql_浙大中控ECS700工程指导手册.pdf
  6. 《C++ Primer》14.1节练习
  7. php7 ast,PHP7新特性之抽象语法树(AST)带来的变化详解
  8. 前端开始学java_[Java教程]开启前端学习之路
  9. lte 在网络覆盖方面应该注意哪些问题_TD-LTE网络深度覆盖三个受限因素及四大解决策略...
  10. android 多线程 崩溃,Android异常崩溃捕获
  11. 简述hdfs工作原理_HDFS 原理简述
  12. wps页眉偶数页不同怎么设置_请问在wps文档中如何设置奇偶页不同的页眉
  13. 保山高考成绩查询2021,2021年保山高考状元名单公布,保山文理科状元是谁多少分...
  14. 爆破字典生成器kali之crunch
  15. 【计算机组织与体系结构】实验二:给定指令系统的处理器设计
  16. 酷派COOL20s什么时候发布 酷派COOL20s配置如何
  17. Linux环境下内存泄露检测
  18. 蓝桥杯单片机省赛——第四届“模拟智能灌溉系统”程序
  19. 学习前段HTML+CSS+JS的过程(一)
  20. rtmp over quic直播服务--mediago

热门文章

  1. maven 打包Could not resolve dependencies for project
  2. 第二单元 测试计划总结
  3. bootstrap单击导航条下的li后,自动收回
  4. 基于layui.upload.js 拖拽文件/文件夹上传下载
  5. 手把手教你如何从0开始开展UI自动化测试
  6. Lauch Debugger automatically when start the process
  7. 第三十二天学习笔记-web漏洞-文件上传的条件竞争、.htaccess文件与.user.ini文件使用前提、二次渲染
  8. java寻找数组中第k大的数
  9. 服务器返回状态码 400、401、403、304 的原因
  10. Android event log 说明