动态规划+深度优先搜索——挖地雷(洛谷 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

相关文章

五大特性引领创新! 深度操作系统 deepin 25 Preview预览版发布

《五大特性引领创新!深度操作系统deepin25Preview预览版发布》今日,深度操作系统正式推出deepin25Preview版本,该版本集成了五大核心特性:磐石系统、全新DDE、Tr... 深度操作系统今日发布了 deepin 25 Preview,新版本囊括五大特性:磐石系统、全新 DDE、Tree

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

C# ComboBox下拉框实现搜索方式

《C#ComboBox下拉框实现搜索方式》文章介绍了如何在加载窗口时实现一个功能,并在ComboBox下拉框中添加键盘事件以实现搜索功能,由于数据不方便公开,作者表示理解并希望得到大家的指教... 目录C# ComboBox下拉框实现搜索步骤一步骤二步骤三总结C# ComboBox下拉框实现搜索步骤一这

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc