基础DP(初级版)

  本文主要内容为基础DP,内容来源为《算法导论》,总结不易,转载请注明出处。

  后续会更新出kuanbin关于基础DP的题目......

动态规划:

  动态规划用于子问题重叠的情况,即不同的子问题具有相同的公共子子问题,在这种情况下分治算法会做许多不必要的工作,它会反复求解那些子子问题使得程序边的缓慢。而动态规划则对每个问题 只求解一次,将其解保存在一个表格中,从而避免一些不必要的重复计算。

  动态规划常用来求解最优化问题,这类问题可以有很多解,每个解都有一个值,我们希望寻找具有最优值的解,我们称这样的解为问题的一个最优解,而不是最优解,因为可能有多个最优解。

  动态规划设计算法的一般步骤:

     1.刻画一个最优解的结构特征。

    2.递归的定义最优解的值。

    3.计算最优解的值,通常采用自地向上的方法。

    4.利用计算出的信息构造一个最优解。

  动态规划的两种基本解题步骤:

    第一种为自顶向下法:此方法仍按自然的递归形式编写过程,但过程中会保存每个子问题的解。当需要一个子问题的解时,过程中会首先检查是否此问题已经被求解,如果是则直接返回该解,否则按通常的方式计算,我们称这个递归过程时带备忘的,因为他记住了之前的计算结果,不会进行重复的计算。

 

    第二种为自底向上法:这种方法一般需要恰当定义子问题的规模的概念,使得任何子问题都只依赖更小的子问题求解。因而我们可以将子问题的规模排序按由小到大的顺序进行求解。当求解某个子问题时,它所依赖的更小的子问题已经得到解决,结果已经保存。每个子问题也只需求解一次。

  最优子结构:

    问题的最优解由相关子问题的最优解构成,这些子问题可以独立求解。

  重构解

    在求解过程中保存相应的状态到另一个辅助数组中即可。

例:钢条切割问题:一根长度为n的钢条,切割不同的长度 i 对应不同的价格p[ i ], 问你如何切割一根钢条使得利益最大化。

  n = i1 + i2 + ... + ik;

  递推式:

    rn = max(pn, r1 + r(n-1), r2 + r(n-2)...r(n-1) +r1)。

  

 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 const int maxn = 1000, INF = -0x3f3f3f3f;
 7 long long dp[maxn], s[maxn];
 8 long long p[maxn] = {0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30};
 9 long long q;
10 
11 long long memoized_cut_rod(int n) {
12     if(dp[n] >= 0) return dp[n];
13     if(n == 0) q = 0;
14     else q = INF;
15     for(int i = 1; i <= n; i ++)
16         q = max(q, p[i] + memoized_cut_rod(n - i));
17     dp[n] = q;
18     return q;
19 }
20 
21 long long bottom_up_cut_rod(int n) {
22     dp[0] = 0;
23     for(int j = 1; j <= n; j ++) {
24         q = INF;
25         for(int i = 1; i <= j; i ++) {
26             q = max(q, p[i] + dp[j - i]);
27         }
28         dp[j] = q;
29     }
30     return dp[n];
31 }
32 
33 int main () {
34     long long n;
35     memset(dp, -1, sizeof dp);
36     while(cin >> n) {
37         long long ans = memoized_cut_rod(n);
38         printf("%d\n", ans);
39         ans = bottom_up_cut_rod(n);
40         printf("%d\n", ans);
41     }
42 }

 

  重构解:

long long bottom_up_cut_rod(int n) {dp[0] = 0;for(int j = 1; j <= n; j ++) {q = INF;for(int i = 1; i <= j; i ++) {if(p[i] + dp[j - i] > q) {q = max(q, p[i] + dp[j - i]);s[j] = i;}}dp[j] = q;}return dp[n];
}while(n) {cout << s[n] << '\t';n = n - s[n];
}

 

 例二:求斐波纳挈数

  

#include <iostream>
using namespace std;const int maxn = 1000, INF = 0x3f3f3f3f;
long long dp[maxn];long long calculate_fib(int n) {if(n == 0 && n == 1) return 1;for(int i = 2; i <= n; i ++)if(dp[i] < 0) dp[i] = dp[i - 1] + dp[i - 2];return dp[n];
}int main () {long long n;for(int i = 0; i < maxn; i ++) dp[i] = -INF;dp[0] = dp[1] = 1;while(cin >> n) {cout << calculate_fib(n);}
}

 

转载于:https://www.cnblogs.com/bianjunting/p/10551303.html

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

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

相关文章

《UNIXLinux程序设计教程》一2.1 UNIX 输入输出基本概念

2.1 UNIX 输入输出基本概念 在任何一种操作系统中&#xff0c;程序开始读写一个文件的内容之前&#xff0c;必须首先在程序与文件之间建立连接或通信通道&#xff0c;这一过程称为打开文件。打开一个文件的目的可能是要读其中的数据&#xff0c;也可能是要往其中写入数据&…

python时间计算_日期天数差计算(Python)

描述 从json文件中读取两个时间数据&#xff08;数据格式例如&#xff1a;2019.01.01&#xff0c;数据类型是字符串&#xff09;&#xff0c;并计算结果&#xff0c;打印出两个时间间隔了多少天。 输入/输出描述 输入描述 json文件名称datetime.json&#xff0c;格式如下&#…

c语言编常见算法,5个常见C语言算法

5个常见C语言算法十进制转换为二进制的递归程序字符串逆置的递归程序整数数位反序&#xff0c;例如12345->54321四舍五入程序(考虑正负数)二分法查找的递归函数#include#include#include//十进制转换为二进制的递归程序voidDecimalToBinary(int n){if(n<0){printf("…

利用Kinect将投影变得可直接用手操控

Finally 总算是到了这一天了&#xff01;假期里算法想不出来&#xff0c;或者被BUG折磨得死去活来的时候&#xff0c;总是YY着什么时候能心情愉快地坐在电脑前写一篇项目总结&#xff0c;今天总算是抽出时间来总结一下这神奇的几个月。 现在回过头来看&#xff0c;上学期退出AC…

my-medium.cnf_您的手机如何打开medium.com-我将让门卫和图书管理员解释。

my-medium.cnfby Andrea Zanin由Andrea Zanin 您的手机如何打开medium.com-我将让门卫和图书管理员解释。 (How your phone opens medium.com — I’ll let a doorman and a librarian explain.) Hey did you notice what just happened? You clicked a link, and now here y…

springboot自动配置的原理_SpringBoot自动配置原理

SpringBoot的启动入口就是一个非常简单的run方法&#xff0c;这个run方法会加载一个应用所需要的所有资源和配置&#xff0c;最后启动应用。通过查看run方法的源码&#xff0c;我们发现&#xff0c;run方法首先启动了一个监听器&#xff0c;然后创建了一个应用上下文Configurab…

Django first lesson 环境搭建

pycharm ide集成开发环境 &#xff08;提高开发效率&#xff09; 解释器/编译器编辑器调试环境虚拟机连接 设置VirtualBox端口 操作1 操作2 点击号添加&#xff0c;名称为SSH&#xff0c;其中主机端口为物理机的端口&#xff0c;这里设置为1234&#xff0c;子系统端口为虚拟机的…

《Drupal实战》——3.3 使用Views创建列表

3.3 使用Views创建列表 我们接着讲解Views的设置&#xff0c;首先做一个简单的实例。 3.3.1 添加内容类型“站内公告” 添加一个内容类型“站内公告”&#xff0c;属性配置如表3-1所示。 为该内容类型设置Pathauto的模式news/[node:nid]&#xff0c;并且我们在这里将节点类型…

c语言函数编正切余切运算,浅谈正切函数与余切函数的应用

九年义务教育三年制初级中学“数学”课本中&#xff0c;对正切函数和余切函数的定义是这样下的&#xff1a;在&#xff32;&#xff54;&#xff21;&#xff22;&#xff23;中&#xff0c;∠&#xff23;&#xff1d;&#xff19;&#xff10;&#xff0c;&#xff41;&#…

wget命令下载文件

wget -r -N -l -k http://192.168.99.81:8000/solrhome/ 命令格式&#xff1a; wget [参数列表] [目标软件、网页的网址] -V,–version 显示软件版本号然后退出&#xff1b; -h,–help显示软件帮助信息&#xff1b; -e,–executeCOMMAND 执行一个 “.wgetrc”命令 -o,–output…

idea mybatis generator插件_SpringBoot+MyBatis+Druid整合demo

最近自己写了一个SpringBootMybatis(generator)druid的demo1. mybatisgenerator逆向工程生成代码1. pom文件pom文件添加如下内容&#xff0c;引入generator插件org.mybatis.generator mybatis-generator-maven-plugin 1.3.5 mysql …

vr格式视频价格_如何以100美元的价格打造自己的VR耳机

vr格式视频价格by Maxime Coutte马克西姆库特(Maxime Coutte) 如何以100美元的价格打造自己的VR耳机 (How you can build your own VR headset for $100) My name is Maxime Peroumal. I’m 16 and I built my own VR headset with my best friends, Jonas Ceccon and Gabriel…

python_装饰器

# 装饰器形成的过程 : 最简单的装饰器 有返回值得 有一个参数 万能参数# 装饰器的作用# 原则 &#xff1a;开放封闭原则# 语法糖&#xff1a;装饰函数名# 装饰器的固定模式 import time # time.time() # 获取当前时间 # time.sleep() # 等待 # 装饰带参数的装饰器 def timer…

欧洲的数据中心与美国的数据中心如何区分?

人会想到这意味着&#xff0c;在欧洲和北美的数据中心的设计基本上不会有大的差异。不过&#xff0c;一些小的差异是确实存在的。您可能想知道为什么你需要了解欧洲和北美的数据中心之间的差异&#xff0c;这对你的公司有帮助吗?一个设计团队往往能从另一个设计团队那里学到东…

老农过河

java老农过河问题解决 http://www.52pojie.cn/thread-550328-1-1.html http://bbs.itheima.com/thread-141470-1-1.html http://touch-2011.iteye.com/blog/1104628 转载于:https://www.cnblogs.com/wangjunwei/p/6032602.html

python isalnum函数_探究Python中isalnum()方法的使用

探究Python中isalnum()方法的使用 isalnum()方法检查判断字符串是否包含字母数字字符。 语法 以下是isalnum()方法的语法&#xff1a; str.isa1num() 参数 NA 返回值 如果字符串中的所有字符字母数字和至少有一个字符此方法返回 true&#xff0c;否则返回false。 例子 下面的例…

docker快速入门_Docker标签快速入门

docker快速入门by Shubheksha通过Shubheksha Docker标签快速入门 (A quick introduction to Docker tags) If you’ve worked with Docker even for a little while, I bet you’ve come across tags. They often look like “my_image_name:1” where the part after the col…

动态规划算法——最长上升子序列

今天我们要讲的是最长上升子序列&#xff08;LIS&#xff09;。【题目描述】给定N个数&#xff0c;求这N个数的最长上升子序列的长度。【样例输入】      【样例输出】7        42 5 3 4 1 7 6那么什么是最长上升子序列呢&#xff1f; 就是给你一个序列…

如何快速掌握一门新技术/语言/框架

IT行业中的企业特点是都属于知识密集型企业。这种企业的核心竞争力与员工的知识和技能密切相关。而如果你在企业中扮演的是工程师的角色的话&#xff0c;那么 你的核心竞争力就是IT相关的知识与技能的储备情况。而众所周知&#xff0c;IT行业是一个大量产生新知识的地方&#x…

c语言今天星期几问题,C语言输入今天星期几

满意答案迷茫03222015.07.24采纳率&#xff1a;55% 等级&#xff1a;9已帮助&#xff1a;665人123456789101112131415161718192021#include<stdio.h>int main(void){ enum weekday{ sun, mon, tue, wed, thu, fri, sat }; int n; printf("输入星期数(0-…