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入门指导相关推荐

  1. 【物体检测快速入门系列 | 01 】基于Tensorflow2.x Object Detection API构建自定义物体检测器

    这是机器未来的第1篇文章 原文首发地址:https://blog.csdn.net/RobotFutures/article/details/124745966 CSDN话题挑战赛第1期 活动详情地址 ...

  2. 【Python零基础快速入门系列 | 07】浪漫的数据容器:成双成对之字典

    这是机器未来的第11篇文章 原文首发链接:https://blog.csdn.net/RobotFutures/article/details/125038890 <Python零基础快速入门系 ...

  3. 【安全利器SELinux快速入门系列 | 02】SELinux 策略实施的可视化操作指南

    这是机器未来的第40篇文章 原文首发地址:https://blog.csdn.net/RobotFutures/article/details/126117336 SELinux 策略实施的可视化操作 ...

  4. 【安全利器SELinux快速入门系列 | 01】SELinux基础入门

    这是机器未来的第35篇文章 原文首发地址:https://blog.csdn.net/RobotFutures/article/details/125914553 文章目录 1. 研究目标 2. se ...

  5. 数位dp总结 之 从入门到模板(stO)

    #转载自https://blog.csdn.net/wust_zzwh/article/details/52100392 基础篇 数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满足 ...

  6. 数位dp总结 之 从入门到模板

    转自巨佬:https://blog.csdn.net/wust_zzwh/article/details/52100392 基础篇 数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满 ...

  7. 数位dp总结 之 从入门到模板

    基础篇 数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满足一些条件数的个数.所谓数位dp,字面意思就是在数位上进行dp咯.数位还算是比较好听的名字,数位的含义:一个数有个位.十位. ...

  8. 数位DP入门+数位DP模板

    数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满足一些条件数的个数.所谓数位dp,字面意思就是在数位上进行dp咯.数位还算是比较好听的名字,数位的含义:一个数有个位.十位.百位.千 ...

  9. 动态规划入门之dp递推~

    欢迎访问https://blog.csdn.net/lxt_Lucia-- 宇宙第一小仙女\(^o^)/--萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗-- 本篇文章重在递推,不 ...

  10. 简单暴力到dp的优化(入门篇)

    上篇,我们提到,遇到问题,首先根据定义写出笨方法,找出依赖关系(有些题这一步就不太简单,要自己归纳关系),然后进行优化,下面,我们通过几道此方面的经典的,较为简单的二维题目进行讲解. 开始根据题来说明 ...

最新文章

  1. “我辞职了,决定全职去开发我的操作系统!”
  2. MySQL索引管理及执行计划
  3. [你必须知道的.NET]第二十二回:字符串驻留(上)---带着问题思考
  4. 道路交通安全违法行为图像取证技术规范_海康移动取证方案中的设备介绍
  5. 使用getline读入
  6. 201771010102 常惠琢《面向对象程序设计(java)》第八周学习总结
  7. Python爬虫入门七正则表达式
  8. 写给年轻程序员的一封信
  9. CentOS7搭建部署Ambari 2.6.2.0最新版(HDP-UTILS、HDP-GPL)大数据平台
  10. 【kafka】Kafka中的动态配置源码分析
  11. Linux之ssh-add命令
  12. crossplaform---Nodejs in Visual Studio Code 04.Swig模版
  13. 使用polar si9000计算差分阻抗
  14. Matlab线性规划
  15. java+毕业设计+进销存管理系统+源码+论文.rar
  16. java实现上传寸照并剪裁,给寸照换背景_用java处置图片(jpg,png,gif.)的背景颜色
  17. 华为(BGP路由技术)
  18. .Net framework3.5装不上解决之道错误代码 0x800F0906、0x800F081F
  19. Pytorch:图像语义分割-FCN, U-Net, SegNet, 预训练网络
  20. html弹性布局平均分配,flex弹性布局.html

热门文章

  1. Highcharts - Bar Chart Column Chart
  2. HTTP 405错误解决方法
  3. 什么是广域网和局域网?
  4. 二进制 转换 .java_如何在Java程序中将二进制转换为十进制?
  5. 一段比较巧妙的sql
  6. 51单片机用c语言在液晶1602上显示汉字,51单片机LCD1602显示汉字(中文)源程序...
  7. 在已有win7系统的基础上重装win10系统
  8. 记关于DNS协议的一次学习(递归查询与迭代查询)
  9. pe系统进服务器2008,怎么用U盘启动win server 2008 pe?
  10. 搜狗批量提交软件-批量提交网站链接