【Lcode 随笔】C语言版看了不后悔系列持续更新中。。。

在这里插入图片描述

文章目录

    • 题目一:爬楼梯
      • 问题描述:
      • 题目分析:
      • 解题思路:
      • 示例代码:
      • 深入剖析:
    • 题目二:打家劫舍
      • 问题描述:
      • 题目分析:
      • 解题思路:
      • 示例代码:
      • 深入剖析:
    • 题目三:最小路径和
      • 问题描述:
      • 题目分析:
      • 解题思路:
      • 示例代码:
      • 深入剖析:

🌈你好呀!我是 山顶风景独好
🎈欢迎踏入我的博客世界,能与您在此邂逅,真是缘分使然!😊
🌸愿您在此停留的每一刻,都沐浴在轻松愉悦的氛围中。
📖这里不仅有丰富的知识和趣味横生的内容等您来探索,更是一个自由交流的平台,期待您留下独特的思考与见解。🌟
🚀让我们一起踏上这段探索与成长的旅程,携手挖掘更多可能,共同进步!💪✨

题目一:爬楼梯

问题描述:

假设你正在爬楼梯。需要 n 步你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

题目分析:

这个问题是一个典型的动态规划问题。我们可以定义一个数组 dp,其中 dp[i] 表示到达第 i 个台阶的方法数。根据题目要求,到达第 i 个台阶可以从第 i-1 个台阶爬 1 步上来,也可以从第 i-2 个台阶爬 2 步上来。因此,状态转移方程为 dp[i] = dp[i-1] + dp[i-2]。同时,我们需要初始化 dp[0] = 1(表示在起点,方法数为 1),dp[1] = 1(表示第一步可以直接爬 1 步上来)。

解题思路:

初始化 dp 数组,dp[0] = 1, dp[1] = 1。
使用循环从 2 到 n 遍历,根据状态转移方程计算 dp[i]。
返回 dp[n],即到达楼顶的方法数。

示例代码:

#include <stdio.h>  int climbStairs(int n) {  if (n <= 1) return 1;  int dp[n + 1];  dp[0] = 1;  dp[1] = 1;  for (int i = 2; i <= n; i++) {  dp[i] = dp[i - 1] + dp[i - 2];  }  return dp[n];  
}  int main() {  int n = 5;  printf("到达楼顶的方法数为: %d\n", climbStairs(n));  return 0;  
}

深入剖析:

这个问题展示了动态规划在解决重复子问题方面的优势。通过存储已经计算过的结果,避免了重复计算,从而提高了算法的效率。此外,这个问题也体现了递归和动态规划之间的区别,即动态规划通过自底向上的方式解决问题,避免了递归可能导致的栈溢出问题。

题目二:打家劫舍

问题描述:

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

题目分析:

这个问题同样是一个动态规划问题。我们可以定义一个数组 dp,其中 dp[i] 表示偷到第 i 个房屋时能够得到的最高金额。由于不能偷相邻的房屋,所以对于第 i 个房屋,我们有两种选择:偷或不偷。如果我们选择偷第 i 个房屋,那么就不能偷第 i-1 个房屋,此时 dp[i] = dp[i-2] + nums[i](nums 是存放金额的数组)。如果我们选择不偷第 i 个房屋,那么 dp[i] = dp[i-1]。因此,状态转移方程为 dp[i] = max(dp[i-1], dp[i-2] + nums[i])。

解题思路:

初始化 dp 数组,dp[0] = nums[0](只偷第一个房屋),dp[1] = max(nums[0], nums[1])(偷第一个或第二个房屋)。
使用循环从 2 到 n 遍历,根据状态转移方程计算 dp[i]。
返回 dp[n],即能够偷窃到的最高金额。

示例代码:

#include <stdio.h>  int rob(int* nums, int numsSize) {  if (numsSize == 0) return 0;  if (numsSize == 1) return nums[0];  int dp[numsSize];  dp[0] = nums[0];  dp[1] = (nums[0] > nums[1]) ? nums[0] : nums[1];  for (int i = 2; i < numsSize; i++) {  dp[i] = (dp[i - 1] > (dp[i - 2] + nums[i])) ? dp[i - 1] : (dp[i - 2] + nums[i]);  }  return dp[numsSize - 1];  
}  int main() {  int nums[] = {1, 2, 3, 1};  int numsSize = sizeof(nums) / sizeof(nums[0]);  printf("能够偷窃到的最高金额为: %d\n", rob(nums, numsSize));  return 0;  
}

深入剖析:

这个问题展示了动态规划在解决选择最优解问题时的强大能力。通过定义状态转移方程,我们可以将问题分解为更小的子问题,并逐一解决。同时,这个问题也提醒我们,在定义状态转移方程时,需要仔细考虑所有可能的情况,确保不漏掉任何一种选择。

题目三:最小路径和

问题描述:

给定一个 m x n 的网格和一个整数。网格中的每个格子都有一个整数。现在你需要从左上角,走到右下角。每次只能向右或者向下移动一步。在网格中只能访问每个格子一次。找出从左上角到右下角的最小路径和。

题目分析:

这个问题同样是一个动态规划问题。我们可以定义一个二维数组 dp,其中 dp[i][j] 表示到达网格中第 i 行第 j 列格子时的最小路径和。由于每次只能向右或向下移动,所以对于第 i 行第 j 列的格子,我们可以从它左边的格子 dp[i][j-1] 或上边的格子 dp[i-1][j] 移动过来。因此,状态转移方程为 dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j](grid 是存放网格中整数的二维数组)。

解题思路:

初始化 dp 数组的第一行和第一列,它们分别表示从左上角到第一行或第一列每个格子的最小路径和。
使用两个嵌套的循环遍历网格中的每个格子,根据状态转移方程计算 dp[i][j]。
返回 dp[m-1][n-1],即从左上角到右下角的最小路径和。

示例代码:

#include <stdio.h>  
#include <limits.h>  int minPathSum(int** grid, int gridSize, int* gridColSize) {  int m = gridSize;  int n = gridColSize[0];  int dp[m][n];  // 初始化第一行和第一列  dp[0][0] = grid[0][0];  for (int i = 1; i < m; i++) {  dp[i][0] = dp[i-1][0] + grid[i][0];  }  for (int j = 1; j < n; j++) {  dp[0][j] = dp[0][j-1] + grid[0][j];  }  // 填充 dp 数组  for (int i = 1; i < m; i++) {  for (int j = 1; j < n; j++) {  dp[i][j] = (dp[i-1][j] < dp[i][j-1]) ? dp[i-1][j] : dp[i][j-1] + grid[i][j];  }  }  return dp[m-1][n-1];  
}  int main() {  int grid[2][3] = {{1, 3, 1}, {1, 5, 1}};  int gridSize = 2;  int gridColSize[2] = {3, 3};  int** gridPtr = (int**)malloc(gridSize * sizeof(int*));  for (int i = 0; i < gridSize; i++) {  gridPtr[i] = grid[i];  }  printf("从左上角到右下角的最小路径和为: %d\n", minPathSum(gridPtr, gridSize, gridColSize));  free(gridPtr);  return 0;  
}

深入剖析:

这个问题展示了动态规划在解决网格类问题时的有效性。通过定义状态转移方程,我们可以将问题分解为更小的子问题,并逐一解决。同时,这个问题也提醒我们,在处理二维网格时,需要注意边界条件的处理,以及如何通过指针或数组来模拟二维网格的


✨ 这就是今天要分享给大家的全部内容了,我们下期再见!😊
🏠 我在CSDN等你哦!我的主页😍

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

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

相关文章

什么是数字化转型?数字化转型对企业有哪些优势?

一、什么是数字化转型&#xff1f; 定义&#xff1a; 数字化转型是指企业或组织将传统业务转化为数字化业务&#xff0c;利用人工智能、大数据、云计算、区块链、5G等数字技术提升业务效率和质量的过程。通俗来说&#xff0c;就是将数字技术应用到企业的各个方面&#xff0c;…

【C语言软开面经】

C语言软开面经 malloc calloc realloc free动态分配内存malloccalloc函数&#xff1a;realloc 函数&#xff1a;free函数&#xff1a; 堆栈-内存分区栈区&#xff08;Stack&#xff09;&#xff1a;堆区&#xff08;Heap&#xff09;&#xff1a;全局&#xff08;静态&#xff…

windows下安装rabbitMQ并开通管理界面和允许远程访问

如题&#xff0c;在windows下安装一个rabbitMQ server&#xff1b;然后用浏览器访问其管理界面&#xff1b;由于rabbitMQ的默认账号guest默认只能本机访问&#xff0c;因此需要设置允许其他机器远程访问。这跟mysql的思路很像&#xff0c;默认只能本地访问&#xff0c;要远程访…

【C++前缀和 动态规划 博弈】1140. 石子游戏 II|2034

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 C动态规划 博弈&#xff1a;往往后续状态已知&#xff0c;前续状态未知 LeetCode1140. 石子游戏 II Alice 和 Bob 继续他们的石子游戏。许多堆石子 排成一行&#xf…

android SELinux权限适配

抓log方法&#xff0c; setenforce 0, 如果不先将selinux设置为permission mode&#xff0c;会导致一个问题。 程序运行的时候遇到权限策略限制&#xff08;假设 sepolicy 1&#xff09;&#xff0c;程序运行失败。添加权限&#xff08;sepolicy 1&#xff09;&#xff0c;然后…

如何将音频转换成mp3?5个宝藏音频转换的方法,学起来!

音频文件已成为我们日常生活中不可或缺的一部分&#xff0c;无论是聆听喜爱的音乐、学习语言课程&#xff0c;还是录制会议内容&#xff0c;音频都扮演着重要角色。然而&#xff0c;随着音频格式的多样化&#xff0c;我们常常会遇到格式不兼容的问题&#xff0c;尤其是在需要将…

【完-网络安全】Windows注册表

文章目录 注册表启动项及常见作用五个根节点常见入侵方式 注册表 注册表在windows系统的配置和控制方面扮演了一个非常关键的角色&#xff0c;它既是系统全局设置的存储仓库&#xff0c;也是每个用户的设置信息的存储仓库。 启动项及常见作用 快捷键 WinR打开运行窗口&#x…

大模型增量训练--基于transformer制作一个大模型聊天机器人

针对夸夸闲聊数据集&#xff0c;利用UniLM模型进行模型训练及测试&#xff0c;更深入地了解预训练语言模型的使用方法&#xff0c;完成一个生成式闲聊机器人任务。 项目主要结构如下&#xff1a; data 存放数据的文件夹 dirty_word.txt 敏感词数据douban_kuakua_qa.txt 原始语…

ubuntu18.04安装教程

window分区 制作启动盘 插入 按F12进入启动选项页面&#xff0c;选择usb启动 选择install ubuntu 进入安装页面 选择中文&#xff08;简体&#xff09; 键盘布局选择英语&#xff08;美国&#xff09; 选择正常安装 等一小会儿 选择其他选项 分区 包括500mb系统分区 1000…

HuggingChat macOS版正式发布!文章内附体验地址!我国打造糖尿病专用AI模型|AI日报

文章推荐 全新豆包AI视频模型发布&#xff01;实测下的可灵与豆包&#xff01;原来它们的差距不止一点点... 今日热点 我国团队打造糖尿病专用AI模型 上海交通大学清源研究院MIFA实验室携手复旦大学附属中山医院内分泌科&#xff0c;组建专家团队&#xff0c;联手开发一款名…

[sql-04] 连续出现至少三次的数字

数据准备 CREATE TABLE leecode_01 (id bigint not null AUTO_INCREMENT,num int DEFAULT NULL COMMENT 用户名,primary key(id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT leecode(连续出现3次的数字)insert into leecode_01(num) values(12); insert into leecode_01…

大二极限编程社团纳新

大二极限编程社团纳新 组题人&#xff1a;徐苏洋 考试时间&#xff1a;9月29日 18&#xff1a;30 - 10月2日 22&#xff1a;00 中抽取任意4小时答题 请大家写程序时打开录屏软件 EV 10月2日23&#xff1a;00 后未提交至钉钉群众默认放弃比赛&#xff0c;成绩为0分 具体分数以最…

题库系统平台开发功能解析

题库系统开发功能介绍可以从多个方面进行阐述&#xff0c;以下是一些核心功能及其详细解释 1. 题库管理系统 题目录入与编辑&#xff1a;提供灵活的题目录入方式&#xff0c;支持手动输入、批量导入&#xff08;如从Excel、Word等文件中导入&#xff09;以及从其他题库中复制试…

PHP程离禁用一段IP的写法示例

PHP程离禁用一段IP的写法示例 。 在PHP中&#xff0c;如果你想禁用一段IP地址的访问&#xff0c;你可以使用$_SERVER[REMOTE_ADDR]来获取访问者的IP地址&#xff0c;然后通过判断IP地址是否在你想要禁用的范围内来决定是否拒绝服务。 以下是一个简单的例子&#xff0c;展示了…

【从0开始搭建微服务并进行部署】SpringBoot+dubbo+zookeeper

文章目录 说明环境搭建创建项目父模块设置子模块 dubbo-api子模块 dubbo-provider子模块 dubbo-consumer测试项目 docker部署项目完整项目地址 说明 jdk1.8SpringBoot2.x低版本dubbo&#xff1a;请查看之前教程【微服务】SpringBootDubboZooKeeper 实战 关于本教程将采用jdk1…

关系模型与关系代数——数据库原理 总结2

2.1 关系模型 关系数据结构 关系模型的数据结构是二维表&#xff0c;亦称为关系。关系数据库是表的集合&#xff0c;即关系的集合。表是一个实体集&#xff0c;一行就是一个实体&#xff0c;它由有关联的若干属性的值所构成。 关系模型的相关概念 列就是数据项 或 字段 或 属…

Yolov8分类检测记录

1.先到github上下载&#xff0c;ultralytics源代码 2.pycharm新建一个项目 3.准备训练数据 数据的结构如下 不需要.yaml文件&#xff0c;代码会自动识别要分的类 4.创建一个训练文件 import torch import random import cv2 import numpy as np import os from ultralytics…

Mac安装Manim并运行

1.在macOS上创建Python虚拟环境&#xff0c;可以使用venv模块&#xff0c;这是Python自带的库&#xff0c;也可以使用conda。以下是使用venv创建和使用Python虚拟环境的步骤&#xff1a; 打开终端。 创建一个新的目录来存放你的项目&#xff0c;并进入该目录&#xff1a; mk…

知识产权管理为何要迈向数字化?

在当今数字化时代&#xff0c;知识产权管理也面临着新的机遇与挑战。传统的知识产权管理方式逐渐显露出效率低下、信息不畅通等弊端。随着数字化浪潮的推进&#xff0c;知识产权管理的数字化建设已成为不可逆转的趋势。 1.提高管理效率 自动化流程&#xff1a;数字化建设可以…

【开源看AI】4.2K star!Reor:AI自动帮你发现知识之间的连接

转自公众号&#xff1a;无人之路 前几天介绍了Quivr&#xff0c;一款用AI帮助个人管理知识、构建第二大脑的人工智能应用。不过Quivr侧重的是将你已有的、很大可能是从其他地方得来的知识文档&#xff08;比如PDF、 Word等&#xff09;汇总成不同主题的Brain&#xff0c;这个汇…