燃 烧 的 大 脑 — — 动 态 规 划 燃烧的大脑——动态规划 燃烧的大脑——动态规划

题目大意:

洛谷例题题目传送门!!!


解题思路:

挖地雷,拥有最优子结构和无后效性特征,考虑DP。

那么接下来问题又来了,DP怎么推,状态是什么? 阶段是什么?
这时候,我们可以在脑海里建一个图:
把每个地窖看成一个节点,把地窖中的地雷数量看成点权,每个连接的地窖之间可以有一条无权边——这时候就很明显了

地窖之间的关系就是一颗带权的树!

然后我们再把样例套进这棵树,观察最优解在树中的关系,我们不难发现——最优解就是点权和最大的一条树须!由于题目说的可能比较抽象(至少我看到那输入输出完全不理解),但是,只要用笔按照树的规律一画,各个数据之间的关系图就一目了然了!

此时,如果把题目的输入省略,那么这个问题就变成了:

给定一颗带点权的树,求点权和最大的一条树须。

把这个例题转换成这样,这个问题就完成了一半,是不是只要和什么最大值最小值有关就下意识的知道接下来的DP该怎么写了——就下来就是烧脑的DP过程,建议洗把脸观看。

首先尝试设定状态:我们把 d p i dp_{i} dpi​ 记为如果只挖到地窖编号为 i i i 的时候的最大可挖地雷数。

这时候就要推状态转移方程了,抓稳了。

首先我们考虑某个地窖 i 已经和另外的一堆地窖连接了起来(就是说 i 节点已经是某条树须的某个部分),现在又进来了一个要考虑的地窖组 j j j(注意,这里说的地窖可能是一条树须,也就是说正在考虑的地窖可能也已经和另外的地窖连接起来了),那么此时,我们就要考虑地窖 i i i 到底要不要和地窖 j j j连接,条件是什么呢?条件就是 ——判断如果地窖 i i i 和地窖 j j j 的连接会不会使得 d p i dp_{i} dpi​ 的答案变差,也就是说不能降低 d p i dp_{i} dpi​ 的最优解性。
再通俗点讲,就是如果 i i i 与 j j j 连接后的点权比原本的 d p i dp_{i} dpi​要大,那么就可以通过连接 i i i和 j j j来更新 d p i dp_i dpi​。

这不,状态转移方程不就出来了吗?

d p i dp_i dpi​ = m a x max max( d p i dp_i dpi​ , d p j + a i dp_j+a_i dpj​+ai​)

最后再来表初始状态,不是有手就行,所有 d p i dp_i dpi​ 一开始都等于 i i i 的地雷数 a i a_i ai​。

状态转移方程都推出来了,输出挖雷路径不是信手拈来的事?只需要在每次更新节点 i i i 的时候都将 i i i 的新父节点记录下来,输出的时候一路向上爬递归输出就行了。

CODE

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
int n,a[30],map[30][30];
int dp[30],sum=0,fre[30],s,ans[30],t=0;
void input()
{cin>>n;for(int i=1;i<=n;i++){cin>>a[i];dp[i]=a[i];  //初始化 fre[i]=i;if(sum<dp[i]) s=i;sum=max(sum,dp[i]);}for(int i=1;i<n;i++){for(int j=i+1;j<=n;j++)cin>>map[i][j];}
}void DP()
{for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){if(map[i][j]==0) continue;if(dp[j]<dp[i]+a[j])fre[j]=i;  //记下父节点 dp[j]=max(dp[j],dp[i]+a[j]);    //状态转移方程 if(sum<dp[j])s=j;sum=max(sum,dp[j]);  //点权和 }}int i=s;while(fre[i]!=i){t++;ans[t]=i;i=fre[i];}  //循环代替地柜输出 t++;ans[t]=i;for(int i=t;i>=1;i--)cout<<ans[i]<<' ';cout<<endl<<sum;
}int main()
{input();DP();return 0;
}

总结:

遇见动归,不要着急写代码,要理清思路,摸到状态转移方程再下手,否则会蒙的!

DP是个博大精深的算法,他非常考验OIer的思维能力,推出状态转移方程更是绝度烧脑,但是当自己做出一道DP题的时候,那种喜悦也是双倍的。

让你们看看我的双倍快乐

[NOIP1996 提高组] 挖地雷 (动态规划)相关推荐

  1. P2196 [NOIP1996 提高组] 挖地雷 线性动态规划DP 题解

    原题链接:[P2196 NOIP1996 提高组] 挖地雷 - 洛谷) 题目分析 看到这道题,首先感觉是个搜索,如果数据范围不大应该没问题.但是,,,我没找到数据范围啊喂~ 那就动态规划一下,先用二维 ...

  2. 2022.12.1洛谷P2196 [NOIP1996 提高组] 挖地雷

    [NOIP1996 提高组] 挖地雷 原题链接:传送门 在一个地图上有N个地窖,每个地窖中埋有一定数量的地雷.同时,给出地窖之间的连接路径.当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然 ...

  3. 洛谷 P2196 [NOIP1996 提高组] 挖地雷(dp简单题)

     题目链接: [NOIP1996 提高组] 挖地雷 - 洛谷 思路: 典型的dp题,由于题目规定了只能由编号小的地窖到编号大的,所以dp顺序是确定的,不需要进行拓扑排序,只需要判断 i,j 之间是否有 ...

  4. [NOIP1996 提高组] 挖地雷(C++,DP)

    题目描述 在一个地图上有NNN个地窖(N≤20)(N \le 20)(N≤20),每个地窖中埋有一定数量的地雷.同时,给出地窖之间的连接路径.当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷, ...

  5. P2196 [NOIP1996 提高组] 挖地雷

    P2196 挖地雷 题目大概意思是给你所有地窖的连接路径,让你选择一条路径使挖到的地雷最多,需要注意的点是这题题目没怎么说清楚,它实际是一个有向图(我一开始当无向图写了半天,死活过不了,最后改成有向图 ...

  6. P1091 [NOIP2004 提高组] 合唱队形(动态规划+LIS)

    P1091 [NOIP2004 提高组] 合唱队形 Part1:链接: 点我就送屠龙宝刀[doge] Part2:题目 Part3:思路 隔了这么久,屑人再次捡起了他的节操,洗了洗,然后开始续写他的苦 ...

  7. 信息学奥赛一本通 1844:【06NOIP提高组】金明的预算方案 | 洛谷 P1064 [NOIP2006 提高组] 金明的预算方案

    [题目链接] ybt 1844:[06NOIP提高组]金明的预算方案 洛谷 P1064 [NOIP2006 提高组] 金明的预算方案 [题目考点] 1. 动态规划:分组背包 2. 动态规划:依赖背包 ...

  8. NOIP大纲整理:(零)历年2000-2016NOIP提高组题目分析

    年份 题目名称 考查内容 难度   2000-2016年NOIP提高组复赛题目 2000-A 进制转换 初等代数,找规律 ★ 2000-B 乘积最大 资源分配DP ★★★ 2000-C 单词接龙 DF ...

  9. 提高组CSP-S初赛模拟试题整理

    目录 提高组 CSP−SCSP-SCSP−S 第 666 套初赛模拟试题整理 提高组 CSP−SCSP-SCSP−S 第 777 套初赛模拟试题整理 提高组 CSP−SCSP-SCSP−S 第 888 ...

最新文章

  1. LVS TUN模式搭建
  2. USB开发基础:USB命令(请求)和USB描述符
  3. Ubuntu 20.04 LTS安装搜狗输入法,只需三条命令,还能自动更新
  4. 成本直降50%,下一代网关震撼发布
  5. 修改vsftpd的默认根目录/var/ftp/pub到另一个目录
  6. VC++ 深入详解 学习笔记(5) -- 修改窗口样式续
  7. 详解TCP协议三次握手四次挥手
  8. SAS在金融中的应用四
  9. Mysql数据库——sql基本语句
  10. 优酷《追光吧!》正式开播 风度、实力成关键词
  11. springboot链接数据库的bug
  12. 从零开始学前端:CSS复合选择器 --- 今天你学习了吗?(CSS:Day10)
  13. Android UI事件传递就是这么个事儿
  14. Struts2中的ValueStack类
  15. swift 全局常量 全局变量的写法
  16. 模拟人生java电脑版_模拟人生免费版电脑版
  17. 爬取豆瓣排名前100的电影
  18. Navicat Premium 15 注册出现 No All Pattern Found! File Already Patched?
  19. (2) python--pandas
  20. Office2007中简繁体转换功能按钮消失解决

热门文章

  1. 2020制冷与空调设备运行操作模拟考试题库及制冷与空调设备运行操作复审模拟考试
  2. 7-33 地下迷宫探索
  3. w10服务器共享文件设置,w10怎么设置共享文件 w10设置共享文件的具体步骤[多图]...
  4. C语言单片机数码管a段亮,宏晶单片机设置强上拉模式让数码管更亮!
  5. 深红色组织结构图表合集PPT模板
  6. Word2007文档中插入或删除分隔符、页码
  7. A~Z--2019年IT圈哪件事让你印象最深
  8. Win10开发:微软详解在应用中使用新型OneDrive API
  9. 上海市计算机中专学校,上海公立中专学校一览表
  10. python 同花顺thstrader_GitHub - python8642/THSTrader-2: 量化交易。同花顺免费模拟炒股软件客户端的python API。(Python3)...