DP入门系列-DP入门指导
DP入门指导
最近在入门dp,当然我还不会dp。不过我已经放下了狠话,我学不会dp我退出实验室。。。
先解释一下DP的最入门的概念:
用我师傅传授给我的一句话说,DP是什么呢,核心是避免重复计算。举个栗子吧。
如果你想算斐波那契额数列的话很简单,但是如果算的数值太大了,比如说,你算到第50位,那么应该怎么算呢???OK咱们先按照正常的思路来写一下正常的斐波那契数列。
#include<stdio.h>
typedef long long ll;
ll F(int a)
{if(a==1||a==2)
return 1;
return F(a-1)+F(a-2);
}
int main()
{int num;scanf("%d",&num);printf("%lld\n",F(num));return 0;}
OK,我想这应该是一个非常好理解的斐波那契数列,那么咱们测试一下这个程序的性能。
好我们可以看到,跑50就用了接近1分钟,那么你这个程序放在服务器上测评绝对是要出问题的啊。所以说这个是一个大的毛病。分析一下原因。为什么会出现这样的情况。
我们可以想一下,每一次计算是不是都要依据你的前一项和你的前两项。这样的话你的前一项是不是又得依赖你的前一项和前俩项。但是算出来的结果是不是可以给别的用?比如说你想算F(5)那么你得算出F(4)和F(3)而F(4)又得算出F(3)和F(2))按理说你已经把F(3)算出来了,可是,F(3)还是要再执行一次那些没有意义的操作。所以这就重复计算了。那么怎么用DP解决这个问题呢??
结果很显然,包括输入时间在内一共用了不到一秒钟。
改进后的DP代码如下
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[5000];
ll F(int a) {if(dp[a]!=-1)return dp[a];ll temp=F(a-1)+F(a-2);dp[a]=temp;return temp;
}
int main() {memset(dp,-1,sizeof(dp));dp[1]=dp[2]=1;int num;cin>>num;cout<<F(num)<<endl;return 0;
}
如此操作的话我们把算过的每一个斐波那契数列都存储了一下,这样的话我们就可以需要的时候直接调用,就剩去了那些繁琐的重复计算。
所以说DP最重要的就是状态转移,换句话说就是当你可以调用的时候就不用再去求一次了。比如说,让你算1+1+1+1+1等于几。很明显答案等于5,那么如果让你算1+1+1+1+1+1呢?你是选择算6次还是说选择在之前5次的基础的状态之上转移过来直接运算?肯定是后者,那么答案直接出来5+1=6。
这样DP的序章终于可以拉开帷幕了!!!
By-轮月
DP入门系列-DP入门指导相关推荐
- 【物体检测快速入门系列 | 01 】基于Tensorflow2.x Object Detection API构建自定义物体检测器
这是机器未来的第1篇文章 原文首发地址:https://blog.csdn.net/RobotFutures/article/details/124745966 CSDN话题挑战赛第1期 活动详情地址 ...
- 【Python零基础快速入门系列 | 07】浪漫的数据容器:成双成对之字典
这是机器未来的第11篇文章 原文首发链接:https://blog.csdn.net/RobotFutures/article/details/125038890 <Python零基础快速入门系 ...
- 【安全利器SELinux快速入门系列 | 02】SELinux 策略实施的可视化操作指南
这是机器未来的第40篇文章 原文首发地址:https://blog.csdn.net/RobotFutures/article/details/126117336 SELinux 策略实施的可视化操作 ...
- 【安全利器SELinux快速入门系列 | 01】SELinux基础入门
这是机器未来的第35篇文章 原文首发地址:https://blog.csdn.net/RobotFutures/article/details/125914553 文章目录 1. 研究目标 2. se ...
- 数位dp总结 之 从入门到模板(stO)
#转载自https://blog.csdn.net/wust_zzwh/article/details/52100392 基础篇 数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满足 ...
- 数位dp总结 之 从入门到模板
转自巨佬:https://blog.csdn.net/wust_zzwh/article/details/52100392 基础篇 数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满 ...
- 数位dp总结 之 从入门到模板
基础篇 数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满足一些条件数的个数.所谓数位dp,字面意思就是在数位上进行dp咯.数位还算是比较好听的名字,数位的含义:一个数有个位.十位. ...
- 数位DP入门+数位DP模板
数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满足一些条件数的个数.所谓数位dp,字面意思就是在数位上进行dp咯.数位还算是比较好听的名字,数位的含义:一个数有个位.十位.百位.千 ...
- 动态规划入门之dp递推~
欢迎访问https://blog.csdn.net/lxt_Lucia-- 宇宙第一小仙女\(^o^)/--萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗-- 本篇文章重在递推,不 ...
- 简单暴力到dp的优化(入门篇)
上篇,我们提到,遇到问题,首先根据定义写出笨方法,找出依赖关系(有些题这一步就不太简单,要自己归纳关系),然后进行优化,下面,我们通过几道此方面的经典的,较为简单的二维题目进行讲解. 开始根据题来说明 ...
最新文章
- “我辞职了,决定全职去开发我的操作系统!”
- MySQL索引管理及执行计划
- [你必须知道的.NET]第二十二回:字符串驻留(上)---带着问题思考
- 道路交通安全违法行为图像取证技术规范_海康移动取证方案中的设备介绍
- 使用getline读入
- 201771010102 常惠琢《面向对象程序设计(java)》第八周学习总结
- Python爬虫入门七正则表达式
- 写给年轻程序员的一封信
- CentOS7搭建部署Ambari 2.6.2.0最新版(HDP-UTILS、HDP-GPL)大数据平台
- 【kafka】Kafka中的动态配置源码分析
- Linux之ssh-add命令
- crossplaform---Nodejs in Visual Studio Code 04.Swig模版
- 使用polar si9000计算差分阻抗
- Matlab线性规划
- java+毕业设计+进销存管理系统+源码+论文.rar
- java实现上传寸照并剪裁,给寸照换背景_用java处置图片(jpg,png,gif.)的背景颜色
- 华为(BGP路由技术)
- .Net framework3.5装不上解决之道错误代码 0x800F0906、0x800F081F
- Pytorch:图像语义分割-FCN, U-Net, SegNet, 预训练网络
- html弹性布局平均分配,flex弹性布局.html
热门文章
- Highcharts - Bar Chart Column Chart
- HTTP 405错误解决方法
- 什么是广域网和局域网?
- 二进制 转换 .java_如何在Java程序中将二进制转换为十进制?
- 一段比较巧妙的sql
- 51单片机用c语言在液晶1602上显示汉字,51单片机LCD1602显示汉字(中文)源程序...
- 在已有win7系统的基础上重装win10系统
- 记关于DNS协议的一次学习(递归查询与迭代查询)
- pe系统进服务器2008,怎么用U盘启动win server 2008 pe?
- 搜狗批量提交软件-批量提交网站链接