2.6学习总结10

动态规划

知识点

动态规划是一种解决问题的策略,适用于具有重叠子问题和最优子结构性质的问题。

动态规划的基本思想是将原问题分解为一系列子问题,通过求解子问题的最优解来得到原问题的最优解。在求解子问题时,利用已经求解过的子问题的解来避免重复计算。

动态规划的步骤如下:

  1. 定义状态:将原问题划分为子问题,并定义子问题的状态。
  2. 定义状态转移方程:确定子问题之间的关系,建立状态转移方程。
  3. 初始化:确定初始状态的值。
  4. 确定计算顺序:根据状态转移方程,确定计算子问题的顺序。
  5. 计算最优解:按计算顺序依次计算子问题的最优解。
  6. 求解原问题:根据子问题的最优解,求解原问题的最优解。

动态规划适用于求解最优化问题,例如最长公共子序列问题、0-1背包问题等。它可以显著提高计算效率,减少不必要的重复计算。

台阶问题

假设有n个台阶,现在要求上楼梯的方式数目。每次只能走1步或2步,问有多少种不同的方式可以到达第n个台阶?

我们定义一个dp数组,dp[i]表示到达第i个台阶的不同方式数目。

对于第i个台阶,有两种情况:

  1. 从第i-1个台阶走1步到达第i个台阶;
  2. 从第i-2个台阶走2步到达第i个台阶。

所以可以得到状态转移方程:dp[i] = dp[i-1] + dp[i-2]。

初始条件是:dp[1] = 1,dp[2] = 2。

根据状态转移方程,可以从第3个台阶开始,依次计算dp数组的值,直到计算到第n个台阶的值。

最终,dp[n]就是到达第n个台阶的不同方式数目。

#include <stdio.h>// 计算n个台阶有多少种上法
int countWays(int n)
{// 创建一个长度为n的数组,用来保存计算结果int dp[n+1];// 基础情况dp[1]=1;dp[2]=2;// 遍历计算每个台阶的上法for (int i=3;i<=n;i++)dp[i]=dp[i-1]+dp[i-2];// 返回最后一个台阶的上法数量return dp[n];
}int main()
{int n;printf("请输入台阶的数量:");scanf("%d", &n);printf("共有%d种上法\n", countWays(n));return 0;
}

P1387 最大正方形

题目描述

在一个 n×m 的只包含 0 和 1 的矩阵里找出一个不包含 0 的最大正方形,输出边长。

输入格式

输入文件第一行为两个整数 n,m(1≤n,m≤100),接下来 n 行,每行 m 个数字,用空格隔开,0 或 1。

输出格式

一个整数,最大正方形的边长。

输入输出样例

输入 #1复制

4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1

输出 #1复制

2

我们定义一个dp数组,dp[i][j]表示以节点 i , j 为右下角,可构成的最大正方形的边长。

只有a[i][j]==1时,节点i,j才能作为正方形的右下角;

对于一个已经确定的dp[i][j]=x,它表明包括节点i,j在内向上x个节点,向左x个节点扫过的正方形中所有a值都为1;

状转转移方程:if (a[i][j]==1) dp[i][j]=min(min(dp[i][j-1],dp[i-1][j]),dp[i-1][j-1])+1;

#include<bits/stdc++.h>
using namespace std;
int main()
{int n,m,b=0,a[101][101],dp[101][101]={0};scanf("%d %d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){scanf("%d",&a[i][j]);if(a[i][j]==1)dp[i][j]=min(min(dp[i][j-1],dp[i-1][j]),dp[i-1][j-1])+1;b=max(b,dp[i][j]);}printf("%d",b);
}

 P1934 封印

题目背景

很久以前,魔界大旱,水井全部干涸,温度也越来越高。为了拯救居民,夜叉族国王龙溟希望能打破神魔之井,进入人界“窃取”水灵珠,以修复大地水脉。可是六界之间皆有封印,神魔之井的封印由蜀山控制,并施有封印。龙溟作为魔界王族,习有穿行之术,可任意穿行至任何留有空隙的位置。然而封印不留有任何空隙! 龙溟无奈之下只能强行破除封印。破除封印必然消耗一定的元气。为了寻找水灵珠,龙溟必须减少体力消耗。他可以在破除封印的同时使用越行术。

题目描述

神魔之井的封印共有 n 层,每层封印都有一个坚固值。身为魔族的龙溟单独打破一层封印时需要消耗的元气为该层封印的坚固值和封印总层数 n 的平方的乘积; 但他也可以打破第 i 层到第 j 层之间的所有封印( i<j),总元气消耗为第 i,j 层封印的坚固值之和与第 i,j 层之间所有封印层(包括 i,j 层)的坚固值之和的乘积,但为了不惊动蜀山,第 i,j 层封印的坚固值之和不能大于 t (单独打破可以不遵守)。

输入格式

第一行包含两个正整数 n 和 t。
第二行有 n 个正整数,第 i 个数为 ai​,表示第 i 层封印的坚固值。

输出格式

仅一行,包含一个正整数,表示最小消耗元气。

输入输出样例

输入 #1复制

6 10
8 5 7 9 3 5

输出 #1复制

578

说明/提示

样例解释

先单独打破第一层,再用越行术从第二层直接打破到最后一层。 这样消耗元气 8×62+(5+5)×(5+7+9+3+5)=5788×62+(5+5)×(5+7+9+3+5)=578。

数据范围

对于 10%10% 的数据, n≤10;
对于 50%50% 的数据, n≤100;
对于 70%70% 的数据, n≤500;
对于 100%100% 的数据, n≤1000,ai​(1≤i≤n),t≤20000。

由题目分出两部分

1. "单独打破一层封印时需要消耗的元气为该层封印的坚固值和封印总层数 n 的平方的乘积".

2. "打破第 i 层到第 j 层封印(i<j)的总元气消耗为第 i, j 层封印的坚固值之和与第 i, j 层之间所有封印层(包括第 i, j 层)的坚固值之和的乘积。同时,第 i, j 层封印的坚固值之和必须不大于一个固定值 t" 。

 可由两部分分别推出

1.dp[j]=min(dp[j],dp[j-1]+a[j]*n*n);2.if(a[j]+a[i]<=t) dp[j]=min(dp[j],dp[i-1]+(a[j]+a[i])*(f[j]-f[i-1]));//i是枚举的点
#include<bits/stdc++.h>
using namespace std;
long long a[1010],sum[1010],dp[1010];
int main()
{int n,t,i,j;scanf("%d %d",&n,&t);for(i=1;i<=n;i++){scanf("%lld",&a[i]);sum[i]=sum[i-1]+a[i];//前缀和}for(i=1;i<=n;i++){long long m=n*n*a[i]+dp[i-1];for(j=1;j<i;j++){if(a[i]+a[j]<=t)m=min(m,(a[i]+a[j])*(sum[i]-sum[j-1])+dp[j-1]);}dp[i]=m;}printf("%lld",dp[n]);
}

 P1115 最大子段和

题目描述

给出一个长度为 n 的序列 a,选出其中连续且非空的一段使得这段和最大。

输入格式

第一行是一个整数,表示序列的长度 n。

第二行有 n 个整数,第 i 个整数表示序列的第 i 个数字 ai​。

输出格式

输出一行一个整数表示答案。

输入输出样例

输入 #1复制

7
2 -4 3 -1 2 -4 3

输出 #1复制

4

说明/提示

样例 1 解释

选取 [3,5][3,5] 子段 {3,−1,2}{3,−1,2},其和为 44。

数据规模与约定

  • 对于 40%40% 的数据,保证 n≤2×10^3。

  • 对于 100%100% 的数据,保证 1≤n≤2×10^5,−10^4≤ai​≤10^4。

暴力解法 

#include<stdio.h>
int main()
{int i,n,k=0;long long sum;int a[200010]={0};scanf("%d",&n);k=0;for(i=1;i<=n;i++)scanf("%d",&a[i]);sum=a[1];for(i=1;i<=n;i++){if(k>0)k+=a[i];elsek=a[i];if(k>sum)sum=k;}printf("%lld\n",sum);
}

动态规划

#include<bits/stdc++.h>
using namespace std;
int n,a[200020],dp[200020],i,ans=-2147483647;
// b[i] 表示截止到 i 时,第 i 个数所在的有效序列的元素和。
int main()
{scanf("%d",&n);for(i=1;i<=n;i++)   {scanf("%d",&a[i]);if(i==1) dp[i]=a[i];else dp[i]=max(a[i],dp[i-1]+a[i]);ans=max(ans,dp[i]);}printf("%d",ans);return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣热门100题 - 3.无重复字符的最长子串

力扣热门100题 - 3.无重复字符的最长子串 题目描述&#xff1a;示例&#xff1a;提示&#xff1a;解题思路 &#xff08;滑动窗口 哈希表&#xff09;&#xff1a;代码&#xff1a; 题目链接&#xff1a;3. 无重复字符的最长子串 题目描述&#xff1a; 给定一个字符串 s &…

step导入到solidworks外观处理方法

在导入到solidworks中的kuka机器人会变成灰色。看上去很不好看。如何才能大体恢复一下原外观呢&#xff1f;主要可以使用如下两种方法。 主要是使用了将里面的形状单独变成零件&#xff0c;方便装配&#xff0c;使机器人可以变化姿态。造成外观颜色丢失。 1.外观复制 如下图所…

springboot165科研工作量管理系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

WebSocket基础详解

文章目录 前言由来简介优缺点适用场景兼容性 API介绍构造函数实例方法send()close() 实例属性ws.readyState&#xff08;只读&#xff09;ws.bufferedAmount&#xff08;只读&#xff09;ws.binaryTypeextensions&#xff08;只读&#xff09;protocol&#xff08;只读&#xf…

Power Designer的使用 创建数据库表模型,生成sql语句,生成C#实体类

几年前用过PowerDesigner&#xff0c;好几年没用&#xff0c;有点忘记了&#xff0c;在这里记个笔记&#xff0c;需要的时候翻一翻 PowerDesigner版本16.5 下面的例子是以MySQL数据库为准 生成C#实体类 一 安装 1.1 安装 不让放网盘链接&#xff0c;审核通不过。。。。 …

JCTC | 利用几何深度学习对蛋白质-配体结合pose进行等变灵活建模

Overview 该论文解决了药物开发中蛋白质-配体复合结构灵活建模的挑战。作者提出了一种名为FlexPose的新型深度学习框架&#xff0c;它可以直接对复杂结构进行建模&#xff0c;而不需要传统的采样和评分策略。 该模型结合了标量-向量双特征表示和 SE(3)等变网络设计来处理动态结…

用Python做一个文件夹整理工具

文章目录 目标文件夹对话框文件映射组件完整组件 此前曾经基于函数实现过这个功能&#xff1a;用Python做一个文件夹整理工具。这次基于面向对象的方法&#xff0c;重新实现这个小工具。 本文中提到的FileSystem&#xff0c;来自于这里&#xff1a;Python根据文件后缀整理文件…

2024年G3锅炉水处理证考试题库及G3锅炉水处理试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年G3锅炉水处理证考试题库及G3锅炉水处理试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大纲随机…

Linux安装Java

yum安装 下面命令直接复制粘贴一件安装java17 yum list installed | grep java #查看已经安装的javayum remove java* -y #移除现在系统已经安装的javayum list | grep java-17 #查看安装java17yum install -y java-17-openjdk #安装java17此处可…

Win32 SDK Gui编程系列之--弹出式菜单

1.弹出式菜单 例如,在命令提示窗口中点击鼠标右键,会出现如下图所示的弹出菜单(下拉菜单)。 这种弹出式菜单的实现很简单。不创建菜单栏,用CreatePopupMenu函数创建的菜单是最顶端的菜单就可以了。 菜单的显示使用TrackPopupMenu函数进行。 例如,点击鼠标右键显示弹出…

C#中使用OpenCvSharp4绘制直线、矩形、圆、文本

C#中使用OpenCvSharp4绘制直线、矩形、圆、文本 继之前的Python中使用Opencv-python库绘制直线、矩形、圆、文本和VC中使用OpenCV绘制直线、矩形、圆和文字&#xff0c;将之前的Python和C示例代码翻译成C#语言&#xff0c;很简单&#xff0c;还是借用OpenCvSharp4库中的Line、…

每日一题——LeetCode1422.分割字符串的最大得分

方法一 暴力枚举 枚举所有分割点的情况&#xff0c;取最大得分 var maxScore function(s) {let res 0;const n s.length;for (let i 1; i < n; i) {let score 0;for (let j 0; j < i; j) {if (s[j] 0) {score;}}for (let j i; j < n; j) {if (s[j] 1) {sco…

Python 的 sys 模块常用方法

sys.argv&#xff1a; 命令行参数 List&#xff0c;第一个元素是程序本身路径 sys.modules.keys()&#xff1a; 返回所有已经导入的模块列表 sys.exc_info() &#xff1a;获取当前正在处理的异常类 exc_type、exc_value、exc_traceback 当前处理的异常详细信息 sys.exit(n)&…

小白代码审计入门

最近小白一直在学习代码审计,对于我这个没有代码审计的菜鸟来说确实是一件无比艰难的事情。但是着恰恰应了一句老话:万事开头难。但是小白我会坚持下去。何况现在已经喜欢上了代码审计,下面呢小白就说一下appcms后台模板Getshell以及读取任意文件,影响的版本是2.0.101版本。…

【ASP.NET Core 基础知识】--前端开发--使用ASP.NET Core和JavaScript进行通信

一、在ASP.NET Core中使用JavaScript 在现代的Web开发中&#xff0c;JavaScript是不可或缺的一部分&#xff0c;它为网页提供了交互性和动态性。而ASP.NET Core作为一个强大的服务器端框架&#xff0c;与JavaScript的结合可以为开发人员带来更加灵活和丰富的体验。本文将探讨如…

SpringBoot集成Swagger2的增强版Knife4j

1. 背景 作为SpringBoot集成中间件其中的一篇文章吧&#xff0c;既然打算出这么一个系列了&#xff0c;争取做到虽小却全&#xff0c;又精又美的一个系列吧。 Swagger应该都有接触吧&#xff0c;knife4j是Swagger2的增强版&#xff0c;更加友好的操作页面&#xff0c;更多强大…

【Java程序设计】【C00187】基于SSM的旅游资源网站管理系统(论文+PPT)

基于SSM的旅游资源网站管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的旅游资源网站 本系统分为前台系统、用户和管理员3个功能模块。 前台系统&#xff1a;当游客打开系统的网址后&#xff0c;首先看到的就是…

使用UC++是遇到的一个令人郁闷的错误

本来是照着一个视频教程学习&#xff0c;结果这个视频讲解的大哥特别喜欢调整方法顺序&#xff0c;而且手速特快&#xff0c;看的我花了眼&#xff0c;就这样调来调去&#xff0c;等到运行时发现一个问题&#xff0c;Tick方法里面的代码总是不执行&#xff0c;这个烂问题困扰了…

体悟PyTorch的优雅

——PyTorch 是所有的框架中面向对象设计的最优雅的一个。 —— PyTorch的设计最符合人们的思维。 编程是一门艺术&#xff0c;编程可以很优雅。研究可以很优雅&#xff0c;研发也可以很优雅。我们的人生可以很优雅&#xff01; 1. PyTorch 的优雅 PyTorch 的面向对象设计确实…

介绍 MSTest Runner – CLI、Visual Studio 等

作者&#xff1a;Amaury Lev Marco Rossignoli Jakub Jareš 排版&#xff1a;Alan Wang 我们很高兴推出 MSTest 运行器&#xff0c;这是一款全新的轻量级 MSTest 测试运行器。这个新的运行器使测试更加便携和可靠&#xff0c;运行速度更快&#xff0c;并且具有可扩展性&#x…