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

相关文章

Vue中动态权限到按钮的完整实现方案详解

《Vue中动态权限到按钮的完整实现方案详解》这篇文章主要为大家详细介绍了Vue如何在现有方案的基础上加入对路由的增、删、改、查权限控制,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、数据库设计扩展1.1 修改路由表(routes)1.2 修改角色与路由权限表(role_routes)二、后端接口设计

Python与DeepSeek的深度融合实战

《Python与DeepSeek的深度融合实战》Python作为最受欢迎的编程语言之一,以其简洁易读的语法、丰富的库和广泛的应用场景,成为了无数开发者的首选,而DeepSeek,作为人工智能领域的新星... 目录一、python与DeepSeek的结合优势二、模型训练1. 数据准备2. 模型架构与参数设置3

前端 CSS 动态设置样式::class、:style 等技巧(推荐)

《前端CSS动态设置样式::class、:style等技巧(推荐)》:本文主要介绍了Vue.js中动态绑定类名和内联样式的两种方法:对象语法和数组语法,通过对象语法,可以根据条件动态切换类名或样式;通过数组语法,可以同时绑定多个类名或样式,此外,还可以结合计算属性来生成复杂的类名或样式对象,详细内容请阅读本文,希望能对你有所帮助...

Nginx实现动态封禁IP的步骤指南

《Nginx实现动态封禁IP的步骤指南》在日常的生产环境中,网站可能会遭遇恶意请求、DDoS攻击或其他有害的访问行为,为了应对这些情况,动态封禁IP是一项十分重要的安全策略,本篇博客将介绍如何通过NG... 目录1、简述2、实现方式3、使用 fail2ban 动态封禁3.1 安装 fail2ban3.2 配

Vue3中的动态组件详解

《Vue3中的动态组件详解》本文介绍了Vue3中的动态组件,通过`component:is=动态组件名或组件对象/component`来实现根据条件动态渲染不同的组件,此外,还提到了使用`markRa... 目录vue3动态组件动态组件的基本使用第一种写法第二种写法性能优化解决方法总结Vue3动态组件动态

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

Java导出Excel动态表头的示例详解

《Java导出Excel动态表头的示例详解》这篇文章主要为大家详细介绍了Java导出Excel动态表头的相关知识,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录前言一、效果展示二、代码实现1.固定头实体类2.动态头实现3.导出动态头前言本文只记录大致思路以及做法,代码不进