【c++笔试强训】(第四十一篇)

news/2024/12/23 11:56:27 标签: c++, 深度优先, 图论, java, 算法, 牛客

目录

体操队形(DFS+枚举)

题目解析

讲解算法原理

编写代码

⼆叉树中的最⼤路径和(树形dp)

题目解析

讲解算法原理

编写代码


体操队形(DFS+枚举)

题目解析

1.题目链接:登录—专业IT笔试面试备考平台_牛客

2.题目描述

题目描述

dddddd作为体操队队长,在给队员们排队形,体操队形为一个单独的纵列,体操队有nnn个同学,标号为1∼n1\sim n1∼n,对于i(1≤i≤n)i(1≤i≤n)i(1≤i≤n)号队员,会有一个诉求(1≤a[i]≤n)(1≤a[i]≤n)(1≤a[i]≤n),表示他想排在a[i]a[i]a[i]号队员前面,当a[i]=ia[i]=ia[i]=i时,我们认为他没有位置需求,随便排哪儿都行,dddddd想知道有多少种队形方案,可以满足所有队员的要求。

输入描述:

读入第一行一个数字n(2≤n≤10)
第二行n个数字,表示a[i],保证1≤a[i]≤n

输出描述:

输出一行,表示方案数

示例1

输入

3 1 1 2

3
1 1 2

输出

1

1

讲解算法原理

解法:
算法思路:

画出决策树,注意剪枝策略~

编写代码

c++算法代码:

#include <iostream>
using namespace std;
const int N = 15;
int ret;
int n;
bool vis[N];
int arr[N];
void dfs(int pos)
{
 if(pos == n + 1) // 找到⼀种合法⽅案 {
 ret++;
 return;
 }
 
 for(int i = 1; i <= n; i++)
 {
 if(vis[i]) continue; // 当前 i 已经放过了 - 剪枝
 if(vis[arr[i]]) return; // 剪枝
 vis[i] = true; // 相当于放上 i 号队员 dfs(pos + 1);
 vis[i] = false; // 回溯- 还原现场 }
}
int main()
{
 cin >> n;
 for(int i = 1; i <= n; i++) cin >> arr[i];
 
 dfs(1);
 
 cout << ret << endl;
 
 return 0;
}

java算法代码:

java">mport java.util.*;
public class Main
{
 public static int N = 15; public static int n, ret; public static boolean[] vis = new boolean[N]; public static int[] arr = new int[N];  public static void dfs(int pos) {
 if(pos == n + 1) // 找到⼀种合法情况 {
 ret++;
 return;
 }
 
 for(int i = 1; i <= n; i++)
 {
 if(vis[i] == true) continue; // 剪枝 - i 号队员已经放过了
 if(vis[arr[i]]) return; // 剪枝
 vis[i] = true; // 相当于已经放上 i 号队员 dfs(pos + 1);
 vis[i] = false; // 回溯 - 恢复现场 } } 
 public static void main(String[] args)
 {
 Scanner in = new Scanner(System.in); n = in.nextInt(); for(int i = 1; i <= n; i++)
 {
 arr[i] = in.nextInt();
 }
 
 dfs(1);
 
 System.out.println(ret);
 }
}

⼆叉树中的最⼤路径和(树形dp)

题目解析

1.题目链接:二叉树中的最大路径和_牛客题霸_牛客

2.题目描述

描述

二叉树里面的路径被定义为:从该树的任意节点出发,经过父=>子或者子=>父的连接,达到任意节点的序列。

注意:

1.同一个节点在一条二叉树路径里中最多出现一次

2.一条路径至少包含一个节点,且不一定经过根节点

给定一个二叉树的根节点root,请你计算它的最大路径和

例如:
给出以下的二叉树,


最优路径是:2=>1=>3,或者3=>1=>2,最大路径和=2+1+3=6

数据范围:节点数满足 1 \le n \le 10^51≤n≤105 ,节点上的值满足 |val| \le 1000∣val∣≤1000

要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

示例1

输入:

{1,2,3}

复制返回值:

6

复制

示例2

输入:

{-20,8,20,#,#,15,6}

复制返回值:

41

复制说明:

其中一条最大路径为:15=>20=>6,路径和为15+20+6=41   

示例3

输入:

{-2,#,-3}

返回值:

-2

讲解算法原理

解法:
算法思路:

树形dp:
a. 左⼦树收集:以左⼦树为起点的最⼤单链和;b. 右⼦树收集:以右⼦树为起点的最⼤单链和;
c. 根节点要做的事情:整合左右⼦树的信息,得到经过根节点的最⼤路径和;
d. 向上返回:以根节点为起点的最⼤单链和

编写代码

c++算法代码:

class Solution
{
public:
 int ret = -1010;
 int maxPathSum(TreeNode* root) 
 {
 dfs(root);
 return ret;
 }
 int dfs(TreeNode* root)
 {
 if(root == nullptr) return 0;
 int l = max(0, dfs(root->left));// 左⼦树的最⼤单链和 int r = max(0, dfs(root->right)); // 右⼦树的最⼤单链和 // 经过root的最⼤路径和
 ret = max(ret, root->val + l + r);
 return root->val + max(l, r);
 }
};

java算法代码:

java">import java.util.*;
/*
 * public class TreeNode {
 * int val = 0;
 * TreeNode left = null;
 * TreeNode right = null;
 * public TreeNode(int val) {
 * this.val = val;
 * }
 * }
 */
public class Solution
{
 int ret = -1010;
 public int maxPathSum (TreeNode root) 
 {
 dfs(root);
 return ret;
 }
 int dfs(TreeNode root)
 {
 if(root == null) return 0;
 int l = Math.max(0, dfs(root.left)); // 左⼦树为根的最⼤单链和 int r = Math.max(0, dfs(root.right)); // 右⼦树为根的最⼤单链和 // 经过root的最⼤路径和
 ret = Math.max(ret, root.val + l + r);
 return root.val + Math.max(l, r);
 }
}


http://www.niftyadmin.cn/n/5796587.html

相关文章

Go 语言并发实战:利用协程处理多个接口进行数据融合

高效地处理多个数据源并将其整合为有意义的结果是开发中一项重要的任务。Go 语言&#xff0c;以其强大的并发特性&#xff0c;为我们提供了优雅而高效的解决方案。那么我们探讨一下如何利用 Go 语言的协程&#xff0c;同时调用多个接口获取数据&#xff0c;并将这些数据无缝地合…

YOLOv8目标检测——详细记录使用OpenCV的DNN模块进行推理部署C++实现

概述 在之前博客中有介绍YOLOv8从环境安装到训练的完整过程&#xff0c;本节主要介绍OpenCV DNN的原理以及使用其进行推理加速&#xff0c;使用C语言来实现。 https://blog.csdn.net/MariLN/article/details/143924548?spm1001.2014.3001.5501 1. DNN OpenCV 是一个用于计算…

Ajax中的axios

既然提到Ajax&#xff0c;那就先来说一说什么是Ajax吧 关于Ajax Ajax的定义 Asynchronous JavaScript And XML&#xff1a;异步的JavaScript和XML。 反正就是一句话总结&#xff1a; 使用XML HttpRequest 对象与服务器进行通讯。 AJAX 是一种在无需重新加载整个网页的情况下&…

深入理解 HTTP HEAD 请求:节省带宽、提高效率的秘密武器

序言&#xff1a; 在HTTP协议中&#xff0c;HEAD请求是一种非常实用且被忽略的请求方法。与GET请求相似&#xff0c;HEAD请求同样从服务器获取资源&#xff0c;但与GET请求的最大不同之处在与&#xff0c;HEAD请求 仅返回响应的头部信息&#xff0c;不包含内容提。这使得HEAD请…

移除0 - 简单

************* c topic&#xff1a;27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; ************* Last case I moved all 0 in the end, and this one is to delete the zero: inspect the last projests code: 移动0 - 简单-CSDN博客文章浏览阅读82次。【代码】…

2. FPGA基础了解--全局网络

前言 引入扇出的概念介绍FPGA中的全局网络为后续时序优化埋下伏笔 扇出 在FPGA设计中扇出是一个重要的概念&#xff0c;所谓的扇出就是一个控制信号所能控制的数据信号的总个数&#xff0c;比如ctrl信号的扇出就是16 reg ctrl 0; reg [15:0] out 0; always (posedge c…

【多模态】swift-3框架使用

swift-3框架使用 前言swift3安装swift训练swift cli推理swift vllm python推理 前言 接前面&#xff0c;swift3相比于swift2做了大升级&#xff0c;很多swift2能使用的在3里面error改改改…但是效率确实大升级&#xff0c;推理速度快了很多&#xff5e;&#xff5e;&#xff5e…

【数字化】华为数字化转型架构蓝图-2

目录 1、客户联结的架构思路 1.1 ROADS体验设计 1.2 具体应用场景 1.3 统一的数据底座 1.4 案例与成效 2、一线作战平台的架构思路 2.1 核心要素 2.2 关键功能 2.3 实施路径 2.4 案例与成效 3、能力数字化的架构思路 3.1 能力数字化的核心目标 3.2 能力数字化的实…