洛谷P2196 [NOIP1996 提高组] 挖地雷【动态规划思路分析】看完直接举一反三!

news2024/11/26 20:38:45

P2196 [NOIP1996 提高组] 挖地雷

  • 前言
  • 题目
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 题目分析
    • 注意事项
  • 代码
  • 后话
    • 额外测试用例
      • 样例输入 #2
      • 样例输出 #2
    • 王婆卖瓜
  • 题目来源

前言

我发现我是天才,只做了三道动态规划的类型题就感觉我已经炉火纯青了。大家快来看看我是怎么做的!思路很重要啊!

题目

题目描述

在一个地图上有 N   ( N ≤ 20 ) N\ (N \le 20) N (N20) 个地窖,每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使某人能挖到最多的地雷。

输入格式

有若干行。

1 1 1 行只有一个数字,表示地窖的个数 N N N

2 2 2 行有 N N N 个数,分别表示每个地窖中的地雷个数。

3 3 3 行至第 N + 1 N+1 N+1 行表示地窖之间的连接情况:

3 3 3 行有 n − 1 n-1 n1 个数( 0 0 0 1 1 1),表示第一个地窖至第 2 2 2 个、第 3 3 3 个、…、第 n n n 个地窖有否路径连接。如第 3 3 3 行为 11000 ⋯ 0 11000\cdots 0 110000,则表示第 1 1 1 个地窖至第 2 2 2 个地窖有路径,至第 3 3 3 个地窖有路径,至第 4 4 4 个地窖、第 5 5 5 个、…、第 n n n 个地窖没有路径。

4 4 4 行有 n − 2 n-2 n2 个数,表示第二个地窖至第 3 3 3 个、第 4 4 4 个、…、第 n n n 个地窖有否路径连接。

……

n + 1 n+1 n+1 行有 1 1 1 个数,表示第 n − 1 n-1 n1 个地窖至第 n n n 个地窖有否路径连接。(为 0 0 0 表示没有路径,为 1 1 1 表示有路径)。

输出格式

第一行表示挖得最多地雷时的挖地雷的顺序,各地窖序号间以一个空格分隔,不得有多余的空格。

第二行只有一个数,表示能挖到的最多地雷数。

样例 #1

样例输入 #1

5
10 8 4 7 6
1 1 1 0
0 0 0
1 1
1

样例输出 #1

1 3 4 5
27

题目分析

  对于一点动态规划觉悟都没有的我来说,这道题一看就不像是动态规划的题,至少没有那么明显。我更想使用暴力搜索来做,毕竟N ≤ \le 20很让人心动,但是考虑不包含技术性还是算了(小伙伴可以自己尝试一下)。
  接着就来考虑状态转移方程,让我们来看在哪里我们的数据会发生变化。很显然,在换到另一个地窖里的时候,而数值是每个地窖的地雷数,所以我们想,如果每次换地窖的时候都可以知道以后地窖的最大地雷数不就好了,所以我们把状态转移方程的重心落在相邻地窖的数量关系上。
  我要进入一个地窖,我肯定是想进入更好的,地雷数最多的地窖,所以我们就有下列方程
f(i)=max[ f(可行) ]+num[i]
  所以我们希望可以找到一个开始或者制定一个规则,使得方程不会陷入死循环,或者说要让它无后效性(先进行的计算不会影响后面的结果)。
  为了保证无后效性,我们需要从最后面的地窖开始算起,因为这个地窖只能由浅入深,所以先处理后面的地窖。并且将最优的下一个地窖存入path里。
  最后就遍历一遍f[],找到最大的ans并通过存储的path一个一个将路径输出。

注意事项

1.地窖只能深入,不是图!所以1–>5不能通过1–>3–>5来实现,这也是能从更深层的地窖开始建立动态规划方程的前提。(一开始我也以为是图,结果想了好久)
2.f中最后一个地窖单独处理,不算入方程中,就像高中的数列总是有一个初始的a0一样。
3.注意路径后面的输出要补一个now,否则没有完全输出完
4.最后一个地窖是不能到任何其他地窖的,所以它的值应该是0,所以在这一步终止。等于0的情况也可能是其他地窖不能到其他地窖(比如例题的地窖3)。但是可以肯定的是路径的最后一步的path[now]一定为0,否则可以前往任意一个可以前往的地窖,从而获得更大的地雷数

代码

耶

#include<iostream>
using namespace std;

int a[1007][1007]={0},num[27]={0},path[27]={0},f[27]={0};
 
int main(){
	int n,maxx=0,ans=0,now=0;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>num[i];
	}
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			cin>>a[i][j];	
		}	
	}
	f[n]=num[n];
	for(int i=n-1;i>0;i--){
		maxx=0;//maxx需要更新 
		for(int j=i+1;j<=n;j++){//获得可行域最大值 
			if(a[i][j])
				if(f[j]>f[maxx])
					maxx=j;
		}
		path[i]=maxx;//记录路径 
		f[i]=f[maxx]+num[i];//动态规划方程 
	} 
	//找到f[]中的最大值 
	for(int i=1;i<=n;i++){	
		if(f[i]>f[ans])
			ans=i; 
	}
	now=ans;
	while(path[now]){//等于0说明结束了,末尾没有其他路径了
		cout<<now<<" "; 
		now=path[now]; 
	}
	cout<<now<<endl;
	cout<<f[ans]<<endl;
	return 0;
}

后话

额外测试用例

因为忘记输出路径而获得了一个用例

样例输入 #2

3
10 20 5
0 1
0

样例输出 #2

2
20

王婆卖瓜

感觉有收获或者想跟上我的进度刷题的,可以点个关注,或者点赞收藏评论都可以!

题目来源

NOIP 1996 提高组第三题
洛谷链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1182578.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何实现生产质量精细化管理?

导 读 ( 文/ 1528 ) 在现代制造业中&#xff0c;实现生产质量的精细化管理对企业的竞争力至关重要。本文将介绍三个关键步骤&#xff0c;包括建立全面质量管理体系、采用数据驱动的质量监控和实时反馈机制&#xff0c;以及持续改进和员工培训&#xff0c;帮助企业实现生产质量的…

[答疑]大老二和德州扑克-属性值没变,状态怎么变了

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 邬俊杰 2023-10-31 21:20 课上说状态是由属性值决定的&#xff0c;比如身高>170算高&#xff0c;某人身高175&#xff0c;算高。如果规则改了&#xff0c;身高>180算高&#xf…

即插即用篇 | YOLOv8 引入Super Token Sampling ViT | 《CVPR 2023 最新论文》

论文地址:https://arxiv.org/abs/2211.11167 代码地址:https://github.com/hhb072/STViT 视觉变换器已经在许多视觉任务中取得了令人印象深刻的性能。然而,它在捕捉浅层的局部特征时可能会受到高度冗余的影响。因此,引入了局部自注意力或早期卷积,这些方法牺牲了捕捉长距…

生产问题分析:批量执行慢,根据日志进行分析。

1.首先拿到日志&#xff0c;查看批量执行的时间段为36:58-42:24 2.截取时间段为36:58-42:24的日志内容。 3.从该批量的第一个代码看起&#xff0c;sql会打印在日志里&#xff0c;查找第一个sql&#xff0c;对照代码一个个看下去。 4.发现两个sql执行的时间间隔特别长&#xff1…

云尘 命令执行系列

第一题 system <?php include "flag.php";if (isset($_POST[cmd])) {system($_POST[cmd]); }show_source(__FILE__);代码如上 system($_POST[cmd]); POST请求发送一个名为 cmd 的参数&#xff0c;然后将该参数的值传递给系统命令执行函数 system()&#xff0c…

高并发下Redis缓存与数据库双写一致性问题原理分析和解决方案

目录 一、什么是缓存与数据库双写不一致性二、常见保证高并发下双写一致性方案2.1、延迟双删&#xff08;不可靠&#xff09;2.2、分布式读写锁&#xff08;可靠&#xff09;2.3、MQ异步消费&#xff08;不可靠&#xff09;2.4、订阅数据库变更日志&#xff08;不可靠&#xff…

2023年十大地推拉新接单平台和网推接单平台,都是一手单

2023年做拉新推广的地推人员&#xff0c;一定不要错过这十个接单平台&#xff0c;助你轻松找到一手单&#xff0c;这10个平台分别是&#xff1a; 主推&#xff1a;“聚量推客” 一手官签接单平台 一手官方邀请码 000000 1. 聚量推客&#xff1a; “聚量推客”汇聚了众多市场…

怎样选择适合自己的ITSM软件?

市场上ITSM解决方案琳琅满目&#xff0c;每种解决方案都有其优点和缺点。这使选择决策过程变得复杂&#xff0c;当组织机构决定投资ITSM软件时&#xff0c;很难如愿选择到一款最适合自己的帮助台软件。 而小编有一套系统的决策方法&#xff0c;可以帮助您简化评估过程&#xff…

Dart(一):Dart入门

Dart入门 Dart安装创建项目安装依赖&#xff08;以http为例&#xff09;依赖库查询地址添加依赖编写运行示例 dart常用命令引用核心库、自定义库、第三方库数据类型Numbers (int, double)Strings (String)Booleans (bool)Lists (List)Maps (Map)Sets (Set)Null (null)Records (…

Django初窥门径-自定义附件存储模型

前言 Django自带了一个名为FileField的字段&#xff0c;用于处理文件上传。然而&#xff0c;有时我们需要更多的控制权&#xff0c;例如定义文件的存储路径、文件名以及文件类型。在本篇文章中&#xff0c;我们将探讨如何自定义Django附件存储模型。 创建attachment应用 pyt…

Unity3d C#实现编辑器不运行状态下执行的脚本

第一章方式&#xff1a; 函数前面 [ContextMenu("Play")] &#xff0c;Inspector面板右键调用 第二种方式&#xff1a; OnValidate() &#xff0c;值改变自动执行 using UnityEngine; using System.Linq;public class NightController : MonoBehaviour {pub…

只需十分钟,快速入门Python3!

文章目录 前言1. 原始数据类型和运算符2. 变量和集合3. 流程控制和迭代器4. 函数5. 类6. 模块7. 高级用法关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小…

软考的好处 拥有软考证书的8大作用

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 1、软考证书认可度高 近年来《国家职业资格…

YOLOv5改进之CODConv,全维动态卷积再改进

目录 一、理论部分 网络结构 二、CODConv 代码 应用到YOLOv5中 一、理论部

本地生活餐饮视频怎么拍摄能有更多流量?如何批量生产呢?

本地生活近几年特别的火&#xff0c;所以到现在各类内容雷同性也比较高&#xff0c;视频缺少新的创意和玩法&#xff0c;像餐饮店的视频&#xff0c;大部分都是拍顾客进门、拍餐饮店座无虚席的实景……作为用户&#xff0c;其实早就已经看腻了。 今天推荐本地生活餐饮店商家拍…

旅游管理与推荐系统Python+Django网页平台+协同过滤推荐算法【计算机毕设项目】

一、介绍 旅游管理与推荐系统。本系统使用Python作为主要编程语言&#xff0c;前端采用HTML、CSS、BootStrap等技术实现界面展示平台的开发&#xff0c;后端使用Django框架处理用户响应请求&#xff0c;并使用Ajax等技术实现前后端的数据通信。本系统主要功能有&#xff1a; …

【ROS】Nav2源码之nav2_collision_monitor详解

【ROS】郭老二博文之:ROS目录 1、简介 nav2_collision_monitor碰撞监视器是一个节点,为机器人提供了一个额外的安全级别。 它使用来自传感器的数据,执行若干与避免碰撞相关的任务,绕过成本图和轨迹规划器,监测是否需要紧急停止或者减速。 2、安全行为 Collision Mon…

ARMday03(寄存器读写、栈、程序状态寄存器、软中断和异常、混合编程)

单寄存器内存读写指令 将一个寄存器中的数值写入到内存&#xff0c;或者从内存中读取数据放在某一个指定寄存器中 指令码和功能 1.向内存中写&#xff1a; str{条件码} 目标寄存器,[目标地址]&#xff1a;将目标寄存器的4字节数值写入到目标地址为首地址的空间中 strh{条件码…

0X03

红包题第二弹 看到源码里面的提示 ?cmdphpinfo(); 看到源码 kk 关键点就是有两个正则表达式 第一个 preg_match("/[A-Za-oq-z0-9$]/",$cmd) 第二个 preg_match("/\~|\!|\|\#|\%|\^|\&|\*|\(|\)|\&#xff08;|\&#xff09;|\-|\_|\{|\}|\[|\]|\|\&q…

【MySQL日志与备份篇】其他数据库日志

其他数据库日志 文章目录 其他数据库日志1. 概述1.1 日志类型1.2 日志的弊端 2. 慢查询日志(slow query log)3. 通用查询日志(general query log)4. 错误日志(error log)5. 二进制日志(bin log)5.1 参数5.2 查看日志5.3 格式5.3.1 STATEMENT模式 &#xff08;基于SQL语句的复制…