动态规划(dynamic programming)介绍



什么是动态规划(dynamic programming),其实它与分治法相同,都是通过组合子问题的解来解决整个问题。分治法是把问题划分成一些独立的子问题,递归的求解各个子问题,然后合并子问题的解而得到原问题的解。不同的是,动态规划适用于子问题不是独立的情况,而是各子问题包含公共的子子问题。这种情况下,若用分治法则会重复的求解公共的子子问题。动态规划算法只对每个子子问题求解一次,将其结果保存在一张表中,从而避免每次遇到各个子问题时重新计算。

动态规划通常应用于最优化问题。此类问题可能有多种可行解,而使用动态规划可以找出一个最优解。

动态规划算法可分为如下4个步骤:

(1)描述最优解[......]

Read more

动态规划教程之装配线调度介绍(图示)



动态规划教程之装配线调度详细介绍(图示)。动态规划的题目练习与解答过程介绍。通过工厂最快路线的结构……

引入“动态规划”算法的例子。如下图,某公司有两条生产汽车的装配线。每一条装配线上有n个装配站,编号为j = 1,2,…,n。将装配线(i = 1,2)的第j个装配站表示为Si,j。装配线1的第j个装配站S1,j,与装配线2的第j个装配站S2,j执行相同的功能,但S1,j和S2,j所需的装配时间可能不同。把装配站Si,j所需的装配时间记为ai,j。一个汽车底盘进入其中一条装配线,然后从每一站进行到下一站。底盘进入装配线的进入时间为ei,装配完的汽车离开装配线的时间为xi。[......]

Read more

c++\pascal\java动态规划实例图示介绍以及什么是动态规划

c++\pascal\java动态规划实例,图示详细介绍什么是动态规划。如何快速理解动态规划的概念与原理呢?学习方法又是什么?动态规划算法解LCS问题介绍等。

什么是动态规划算法

动态规划一般也只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,问题能够分解成子问题来解决。

动态规划算法分有4个步骤:

1. 描述最优解的结构

2. 递归定义最优解的值

3. 按自底向上的方式计算最优解的值   //此3步构成动态规划解的基础。

4. 由计算出的结果构造一个最优解。[......]

Read more

c++算法练习题之计算连续子数组的最大和

c++算法练习题之计算连续子数组的最大和。以及动态规划的简单使用实例。

题目:输入一个整形数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组,求所有子数组的和的最大值。要求时间复杂度为O(n)

例如输入的数组{1, -2, 3, 10, -4, 7, 2, -5},和最大的子数组为{3, 10, -4, 7, 2},因此输出为该子数组的和18。

如果不考虑时间复杂度,可以枚举出数组的所有子数组并求出它们的和。长度为n的数组,共有n(n+1)/2个子数组。计算所有子数组的和,最快也需要O(n^2)的时间。本题还有更快的解法。

解法一:分析规律

当[......]

Read more

c++重载操作符介绍以及什么运算符是不可以重载的

c++重载操作符介绍以及什么运算符是不可以重载的?什么是运算符的重载呢?有什么注意事项?重载操作符是具有特殊名称的函数,函数名称由关键字operator后接操作符符号。

Sales_item operator+(const Sales_item& lhs, const Sales_item& rhs);

绝大多数操作符都可以重载,不能重载的操作符包括:“::”、 “.*”、 “.”、 “?:”。

重载操作符必须具有一个类类型(或枚举类型)的操作数,这条规则强制了重载操作符不能重新定义用于内置类型的操作符的含义。[......]

Read more

c++语言程序设计习题之用O(1)时间删除单向链表的结点

c++语言程序设计习题之用O(1)时间删除单向链表的结点。

本文摘自《剑指Offer》

题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点和函数的定义如下:

struct ListNode
{
int m_nValue;
ListNode* m_pNext;
};

void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted);

在单向链表中删除一个结点,最常规的做法是从链表的头结点开始,顺序遍历查找要删除的结点,找到之后再删除。由于需要顺序查找,时间复杂度是[......]

Read more

c++语言程序设计习题之如何反转链表

c++语言程序设计算法习题之如何反转链表。链表的定义。

题目来自剑指Offer

题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的表的头结点。链表的定义如下:

struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};

解决与链表相关的问题总是有大量的指针操作,非常容易出错。为了避免出错,最好先进行全面的分析。在实际的软件开发周期中,设计的时间通常不会比编码的时间短。在编码之前仔细分析和设计,将会给面试官留下很好的印象。与其很快写出一段漏洞百出的代码,倒不如仔细分析再写出鲁棒的代码。

为了正确的反[......]

Read more

c语言程序设计习题之链表中倒数第n个结点实例代码

c++语言程序设计习题之链表中倒数第n个结点实例代码。输出该链表中的某个结点的实例。

题目来自剑指Offer

语言程序设计习题:输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,现在从1开始计数,即链表的尾节点是倒数第一个结点。例如一个链表有6个结点,从结点开始它们的值依次是1、2、3、4、5、6.这个链表的倒数第三个结点是4的结点。

c++链表结点定义方法如下:struct ListNode

{

int m_nValue;

ListNode*  m_pNext;

}

输出该链表结点代码:

#include <[......]

Read more

c语言程序设计习题之从尾到头打印链表

c语言程序设计习题之从尾到头打印链表。c++链表应用实例。

题目来自剑指Offer

c++算法题目:输入一个链表的头结点,从头到尾反过来打印出每个结点的值。

c++练习代码实例:

#include <iostream>
#include <assert.h>
using namespace std;

struct LinkNode
{
int m_Data;
struct LinkNode* m_pNext;
};

void CreateList(LinkNode** pHead,int nLen)//头指针使用指针的指针[......]

Read more