动态规划+深度优先搜索——挖地雷(洛谷 P2196)

2023-10-22 18:20

本文主要是介绍动态规划+深度优先搜索——挖地雷(洛谷 P2196),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目选自洛谷P2196

本题是一道基础的练习题,可以采用动态规划和DFS的方法来求解。

动态规划的解题思路:

 

DFS的解题思路:

由于只能从数字小的到数字比它大的地方走,所以for i从出发点+1开始,如果有路且没走过就走,更新一下总数。

当总数比之前某一次的值大,我们就更新一下路径和总数。

用a[21]来记录最终的结果,用b[21]来保存每种dfs的路径,更新路径就是把b数组赋给b数组

dfs(int x,int y,int ans) //x表示当前在第x点,y为走了多少个点,ans为当前雷的总数

走过一个点就标记,走完之后记得回溯一下即可

题目描述

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

输入格式

有若干行。

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

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

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

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

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

… …

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

输出格式

有两行

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

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

输入输出样例

输入 1

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

输出 1

1 3 4 5
27

说明/提示

【题目来源】

NOIP 1996 提高组第三题

 解题代码:(动态规划版)

#include<stdio.h>
#include<iostream>
using namespace std;
int n,a[21][21];
int f[21],w[21],q[21],ans[21];
int main(){cin>>n;for(int i=1;i<=n;i++) {scanf("%d",&w[i]); f[i]=w[i];}//雷的数目for(int i=1;i<n;i++)for(int j=i+1;j<=n;j++)scanf("%d",&a[i][j]);for(int i=1;i<=n;i++)for(int j=1;j<i;j++)if(a[j][i]){if(f[j] + w[i] > f[i]){f[i] = f[j] + w[i];q[i] = j;}}int x=0,tot=0;for(int i=1;i<=n;i++)if(f[x]<f[i]) x = i;ans[0] = f[x];while(x){ ans[++tot] = x; x=q[x];}for(int i=tot;i>1;i--) printf("%d ",ans[i]);printf("%d",ans[1]);printf("\n%d",ans[0]);return 0;
}

 

解题代码: (DFS版)

#include<stdio.h>
#include<iostream>
using namespace std;
int n,cnt=-999,v,k; //k保存结果应该是几个数
int f[21][21],book[21];
int lei[21];
int a[21],b[21]; //a是结果,b用来每次dfs记录路径
/* 只能从右下进行遍历 */
void dfs(int x,int y,int ans){ //x为位置,y为走了多少个点,ans为雷的总数b[y] = x; //保存路径if(ans > cnt){  //更新路径for(int i=1;i<=y;i++)a[i] = b[i];cnt = ans;k = y;}for(int i=x+1;i<=n;i++){if(f[x][i] && book[i]==0){book[i] = 1;dfs(i,y+1,ans+lei[i]);book[i] = 0;}}
}
int main(){cin>>n;for(int i=1;i<=n;i++) cin>>lei[i];for(int i=1;i<n;i++)  //保存图for(int j=i+1;j<=n;j++){scanf("%d",&f[i][j]);}for(int i=1;i<=n;i++){ //每个点都作为起点dfs一次book[i] = 1; b[1]=i;dfs(i,1,lei[i]);book[i] = 0;}for(int i=1;i<=k;i++)printf("%d ",a[i]);printf("\n%d",cnt);return 0;
}

这篇关于动态规划+深度优先搜索——挖地雷(洛谷 P2196)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/262913

相关文章

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷