ACM0基础动态规划启蒙:Dp是个啥

【C语言学习笔记】算法篇——动态规划 浅谈动态规划Dynamic Programming 写在前面: 学习这个算法的缘由其实是这篇博客,当时在写完这道题的题解时,师兄好心地提醒我有一个说法不太准确,就是到底是不是贪心算法,在学习了动态规划后发现这两者真的有挺多共同点的。且上次月赛挺多题目都涉及到了动态规划的思想,故今天来整理一下,先立个FLAG,这篇博客应该要写很久很久很久… 什么是动态规划? 首先要了解的是,和贪心算法一样,动态规划算法只是一种思想,不是像排序算法一样有具体的代码。 我第一次学习动态规划,是在《算法图解》这本书中,因此后面的 阅读详情

动态规划:DP:Dynamic Programming是算法的设计方法,是一种编程思想,主要用于解决最优解、计数类型的问题。

Dp是一种思想!!!是一种没有固定代码的算法。

如果不是一定要有严谨的记忆化,状态意义,状态转移方程,步数合并的过程才叫Dp,那么不妨把一些奇奇怪怪的东西也和Dp扯上关系

0基础新人的第一个启蒙算法应该大部分都是 Dfs ,好我现在就把这个东西叫做Dp。

Question:Dfs为什么叫Dp?

Dp需要步数合并对吧,把一些没必要的操作给省略掉或者一些可以合并的操作給合并。

举个例子:跳台阶
0为起点,n为终点每次只能跳一步或者跳两步,也就是产生 两种选择。求从0到恰好跳到n的过程中有多少种跳跃方式?
eg : n等于4的时候答案为5
序列分别是
1111
121
112
211
22

对于这个题目,新手很容易能想到Dfs,也就是从1开始搜索每一个点的两次抉择,也就是2^n次抉择的超暴力dfs。
程序也非常容易写出来:

int dfs(int k)//函数功能:返回0到k的步数可能序列;
{
	if(k<=2)return k;
	else return dfs(k-1)+dfs(k-2);//当然是等于前两个啦。
}

但是你看一下,有些东西不对劲哦:
你看看程序访问了什么东西

5
4
3
3
2
1
2
1
1
1
2
1

wow,你的搜索有够 暴力 的,你注意到3被重复搜索了,2也被重复了,天哪比3还多,oh,1竟然被访问了5次。
你手算了一下n等于更大的时候注意到自己竟然有如此多没有必要存在的操作。
于是你开了个数组并且命名为remember[];
紧急修改你的暴力dfs代码;

int rem[10000+10];
int dfs(int k)//函数功能:返回0到k的步数可能序列;
{
	if(rem[k])return rem[k];//如果已经被访问过直接返回结果
	if(k<=2)return k;
	else return rem[k] = dfs(k-2)+dfs(k-1);//要记得赋值更新哦。
}

好耶,现在你在算算时间花了多少。好,O(n)。
你相当于用大剪刀把树枝给减掉了。用的方法是记忆下来结果,避免重复操作。

恭喜你,你的Dp入门了。

接下来解释几个名词:
状态储存:像刚才一样,每一个“局面”也就是树上的点是我们访问过的状态,用rem[i]记录。
状态意义:状态的准确意义,比如rem[i] = 0-k步的操作可能序列
状态转移:rem[i] = ?谁对这个状态有贡献,或者说取决于谁。
状态转移方程:rem[i] = rem[i-1]+rem[i-2];

上面代码就是记忆化Dfs,顾名思义就是dfs同时记忆结果减少重复访问。Dp某种意义是和记忆化dfs相等的。

这个时候不要兴冲冲就去写了,你漏一个至关重要的东西,这个东西非常隐秘而且对于新手或者粗心的代码者来说相当易错:边界

如果你写成

int dp[10000+10];
int Dp(int k)//函数功能:返回0到k的步数可能序列;
{
	for(int i =1;i<=k;++i){dp[i]=dp[i-1]+dp[i-2];}
}

你甚至越界了,注意边界还有保证一些东西的初始化,比如:

int dp[10000+10];
int Dp(int k)//函数功能:返回0到k的步数可能序列;
{
	dp[1]=1;dp[2]=2;
	for(int i =3;i<=k;++i){dp[i]=dp[i-1]+dp[i-2];}
}

当然如果真的n这么大会爆long long,一般题目还会存在模数,这里不做讨论。

现在你已经懵懵懂懂对Dp有大概了解了,是时候来点真题了:
过河卒
方格取数
栈
最大子段和
洛谷可以看题解,题解自己研究吧,都是适合入门的普及-难度。

从Hello World到Goodbye OI:一个竞赛生的算法人生 本文讲述了一位竞赛生从初识编程到告别OI的完整历程,分享了从Hello World到国家集训队的成长故事。通过个人经历详细剖析了算法竞赛中的关键转折点、训练方法和心态管理,为OIer提供了宝贵的实战经验与建议。 阅读详情

相关推荐

主流OJ平台深度横评:从POJ到洛谷,算法学习者的实战指南

在线评测系统(Online Judge, OJ)是算法学习与竞赛的核心训练平台,其核心原理在于通过自动化判题系统,对用户提交的代码进行功能、效率与正确性的全面检验。这项技术的价值在于将抽象的算法知识转化为可验证的工程实践能力,是提升编程思维和问题解决效率的关键工具。其应用场景广泛覆盖了计算机专业教育、算法竞赛备赛(如ACM/ICPC、NOI)以及企业技术面试准备等多个领域。本文基于资深开发者的长期使用体验,深入剖析了包括POJ、HDOJ、洛谷(Luogu)及USACO在内的多个主流OJ平台。文章结合“洛谷小

weixin_34372728的博客 316

ACM算法学习路线、清单:从入门到精通

本文详细介绍了ACM算法竞赛从入门到精通的系统化学习路线,涵盖基础算法、数据结构、动态规划、图论进阶及数学与计算几何等核心内容。通过实战案例和优化技巧,帮助竞赛选手快速提升算法能力,掌握关键解题思维。

weixin_30632089的博客 412

从新手到高手:杭电、POJ、ZOJ三大OJ平台算法进阶路线全解析

本文全面解析杭电、POJ、ZOJ三大OJ平台的算法进阶路线,从新手入门到高手突破,涵盖平台特点、刷题策略、算法思维建立及竞赛技巧。特别推荐杭电的友好入门题、POJ的严谨算法体系以及ZOJ的高难度挑战,帮助读者系统提升算法能力。

weixin_27219587的博客 403

讲一讲dp

dp入门

superperter的博客 1万+

无参考图像质量评估方法:BRISQUE、RankIQA、DIQA

常用的图像质量评估(IQA)分为无参考和有参考两种类型。常见的有参考图像质量评估方法有PSNR,SSIM以及VMAF。其中vmaf是针对视频来讲的,在它的评价方法里面添加了一些时域信息,如果应用于单张图片,需要做一些处理,如去除时域信息。有参考意味着图像质量是以参考图为基准。基于参考图像都是高清图像的假设,这些评价方法已经广泛应用于图像压缩以及图像传输、拼接之类的处理后图像的质量,假如这张参考图的质量本身就比较渣,那么该评价指标可信度就大大降低。

weixin_51732791的博客 3191

手把手教你用STM32H743+FreeRTOS+LWIP搭建物联网网关(附完整工程)

本文详细介绍了如何使用STM32H743微控制器结合FreeRTOS实时操作系统和LWIP协议栈构建高性能物联网网关。内容涵盖硬件配置、FreeRTOS任务设计、LWIP协议栈优化及物联网协议集成,提供完整工程示例,助力开发者快速实现稳定可靠的网络通信枢纽。

weixin_42623010的博客 502

ACM入门之【DP】

DP全称动态规划,是算法中的重中之重。 目录背包问题01背包问题 背包问题 01背包问题 //f[i][j] 从前i个物品选,体积不超过j的最大价值 for(int i=1;i<=n;i++) { for(int j=0;j<=m;j++) { f[i][j]=f[i-1][j]; if(j>=v[i]) f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]); } } cout<<f[n][m];.

辉小歌的博客 2724

Protege新手入门:5分钟搞定本体建模基础(附实战案例)

本文为Protege本体建模新手提供了一份快速入门指南。通过构建一个关于“披萨”的实战案例,详细讲解了从环境准备、定义核心类(Classes)、建立对象属性(Object Properties)到设置数据属性(Data Properties)和创建个体的完整流程。文章旨在帮助读者绕过复杂理论,在5分钟内直观掌握本体建模的基础操作,快速建立知识图谱构建的信心。

weixin_28335283的博客 283

dp的初步理解

dp的理解 dp的正规解释是:动态规划(英语:Dynamic programming,DP)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。 动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量: 一旦某

qq_45577352的博客 1万+

Agentic AI应用架构师如何提升AI应用的灵活性

可扩展性(Scalability):快速添加新功能或扩展任务范围(如Agent从“客服”扩展到“供应链管理”);可修改性(Modifiability):调整Agent的决策逻辑或动作策略,无需重构整个系统;鲁棒性(Robustness):在环境异常或数据噪声下保持性能稳定;自适应(Self-Adaptation):自主学习新场景,无需人工干预。状态空间(S):Agent能感知的所有内部/外部状态(如用户需求、环境数据);动作空间(A):Agent能执行的所有动作(如调用工具、发送消息);

项目管理的博客 582

手把手教你学simulink实例--基于Simulink的储能系统性能评估与仿真

储能系统是现代能源体系中的关键组成部分,广泛应用于可再生能源并网、电网调峰调频、电力质量改善以及电动汽车充电等领域。为了提高储能系统的运行效率和可靠性,对其性能进行准确评估至关重要。基于MATLAB/Simulink平台,可以构建储能系统的动态模型,并通过仿真分析其在不同工况下的性能表现。本项目旨在研究储能系统的建模方法、控制策略及其性能评估指标,并通过Simulink仿真验证系统的动态特性和稳态性能。

MHD0815的博客 195

普通用户增加/dev/ttyACM0操作权限

干煸四季豆 1万+

64.qt quick-qml使用高德地图插件实现V2版本(新增:位置搜索、路径规划、轨迹编辑等)

qt quick-qml高德地图插件(新增:位置搜索、路径规划、轨迹编辑等) Qt地图插件,使用简单方便,不用浏览器内核,运行高效迅速 跨平台支持,(Qt Windows(MinGW, MSVC)\Linux(桌面、嵌入式)\Android\IOS\等) 在线更新瓦片地图下载,并且支持缓存保存离线地图实现.........

抵抗时间扭曲,坚持做一件有意义的事 6129

动态规划(Dynamic Programming,简称DP)

动态规划是运筹学的一个分支,通常用来解决多阶段决策过程最优化问题。动态规划的基本想法就是将原问题转换为一系列相互联系的的子问题,然后通过逐层递推来求得最后的解。目前,动态规划常常出现在各类计算机算法竞赛(例如ACM,蓝桥杯)或者程序员笔试面试中,在数学建模比赛中出现的较少,但这个算法的思想在生活中非常实用,学完本节后对你解决实际问题的思维方式一定很有启发。 动态规划(Dynamic Programming,DP)是运筹学的一个分支,通常用来求解决策过程最优化问题。 本节我们将主要以例题的形式来进行讲解,通

数学建模学习交流的博客 1893

Qt项目开发实例 (含源码)

qt教程、qt项目、qt下载、qt项目实战、qt多线程。本文通过分析demo源码,QT实战的方式进行学习,学习路线是以实战为目录,全面的使用自己的学习知识,文章中编写一系列的学习游戏demo,与大家一起分享。

啊渊的专栏 14万+

Android蓝牙中的Rfcomm协议介绍

RFCOMM(Radio Frequency Communications)是一种基于蓝牙技术的串口仿真协议,以下是详细介绍:一、协议概述二、工作原理三、应用场景

手机-手表蓝牙开发工程师的博客 712

SDUT ACM 2619 地板砖 状态压缩启蒙题。。

地板砖 Time Limit: 1000ms Memory limit: 65536K有疑问?点这里^_^ 题目描述 利用假期时间,豆豆找个了临时工,帮有钱人家贴地板砖,假设房子的形状为N x M的矩形,每个地板砖的大小为1 x 1,且只有黑白两种颜色,这家人很奇怪,他们不喜欢房间中任何一个2 x 2的局部区域的4块地板砖的颜色一样。如果出现这...

weixin_30480583的博客 95

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

从算法竞赛到编程启蒙:洛谷平台学习路径与实战策略解析

算法竞赛作为计算机科学领域的重要分支,其核心在于通过系统训练提升问题抽象、逻辑思维与算法实现能力。其原理基于对经典算法与数据结构的掌握,并通过在线评测系统实现即时反馈与迭代优化。这一技术路径不仅为信息学奥林匹克竞赛(OI)提供训练基础,更在编程启蒙、思维训练和工程实践能力培养方面具有重要价值。在应用场景上,算法竞赛训练平台如洛谷,通过题库系统、社区生态和比赛机制,构建了从入门到进阶的完整学习路径。本文聚焦于洛谷平台,深入探讨如何通过结构化刷题、系统化调试和社区参与,实现编程能力的有效提升,并警惕‘抄题解’和

weixin_30736301的博客 528

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

poj 2411 Mondriaan's Dream(状压DP->求铺方格的方法数)@

Mondriaan's Dream Time Limit:10000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description Squares and rectangles fascinated the famous Dutch painter Pie

MR CODER 489

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

本周博客总结

最开始学acm是从dfs入门的,当时看题的时候就看到好多dfs题的题解都有dp的做法,这个周也终于有机会亲身领略一下dp了

m0_64476152的博客 128

Codeforces Round 1065

Codeforces Round 1065 (Div.3) 题解与参赛记录合集,包含多篇B站视频解析(A-H题)、优快云博客补题笔记(D/F/G/H题)及知乎相关讨论。主要内容涵盖:比赛实况(如UP主首次CF场第一、7题上蓝记录)、题目详解(C~H题思路)、树形DP/计数等算法分析,以及部分选手的VP补题经验。附带无关的英语启蒙和少儿STEM学习资料推荐(可忽略)。

青少年趣味编程 56

计算机专业宝藏老师:从基础到前沿,如何找到并最大化学习价值

在计算机科学领域,扎实的基础知识是构建技术能力的基石。数据结构与算法、计算机系统原理等核心课程,不仅是理解编程语言和框架的底层逻辑,更是培养高效问题解决能力的关键。通过亲手实现基础数据结构(如动态数组、LRU缓存)和深入剖析系统调用流程,学习者能跨越理论与实践的鸿沟,掌握性能优化与系统设计的工程思维。这种从“解题”到“造轮子”的思维跃迁,对于应对工业界复杂的软件开发、云计算部署及AI模型优化等场景具有重要价值。优秀的导师往往能通过贯通式教学和真实项目,将算法复杂度、内存管理等抽象概念与容器化、微服务等现代工

weixin_33858336的博客 370

图论算法入门

本文为算法竞赛入门指南,重点介绍图论学习路径。文章讲解了图的两种存储方式(邻接表和链式前向星),后续内容将涵盖DFS/BFS、并查集、最短路等进阶算法,适合刚接触算法的学习者参考。

German_Sparrow的博客 721

到底什么是dp思想(内含大量经典例题,附带详细解析)

&#13; 期末了,通过写博客的方式复习一下dp,把自己理解的dp思想通过样例全部说出来说说我所理解的dp思想dp一般用于解决多阶段决策问题,即每个阶段都要做一个决策,全部的决策是一个决策序列,要你求一个最好的决策序列使得这个问题有最优解将待求解的问题分为若干个相互联系的子问题,只在第一次遇到的时候求解,然后将这个子问题的答案保存下来,下次又遇到的时候直接拿过来用即可dp和分...

Y先森0.0 6万+

描述性编程(DP)

描述性编程(DP):不需要将对象添加到对象库中,其可描述的属性必须是QTP内置的属性,且都是封装接口的属性,不是自身接口的属性 有两种编程方式: 第一种:对象名(“属性名:=属性值”) Browser("micClass:=Browser").Page("micClass:=Page")._ WebEdit("html tag:=INPUT","name:=wd").Set "测试" Bro

勿忘初心,方得始终 1554
上一篇: 【板子库】P3384 【模板】轻重链剖分 / 树链剖分模板题
下一篇: 2020.11.8 CCPC赛后总结(包括阶段总结【ccpc长春分站赛铜总结】
DevourPower
博客等级 码龄7年 52粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值