c++动态规划经典算法

c++动态规划经典算法攻略

什么是动态规划

动态规划(Dynamic Programming,DP)是一种解决多阶段决策问题的优化算法,其本质是将原问题分解为若干个子问题,同时记录下每个子问题的最优解,以便于后续利用。

动态规划通常由三个步骤构成:

  1. 定义状态,即确定子问题的规模和状态表示;
  2. 状态转移,即确定子问题之间的转移关系,从而将问题规模缩小;
  3. 确定边界条件,即确定最小子问题的解,以便于递推过程中能够终止。

动态规划的经典算法

01背包问题

假设有一个背包和 $n$ 个物品,第 $i$ 个物品的价值是 $v_i$,重量是 $w_i$。问最多可以装多少价值的物品?

下面是一个例子:

#include <bits/stdc++.h>
using namespace std;

const int N = 1e3 + 10;
int n, c, w[N], v[N], f[N][N];

int main() {
    cin >> n >> c;

    for (int i = 1; i <= n; i++)
        cin >> w[i] >> v[i];

    for (int i = 1; i <= n; i++)
        for (int j = 0; j <= c; j++)
            if (j >= w[i])
                f[i][j] = max(f[i - 1][j], f[i - 1][j - w[i]] + v[i]);
            else
                f[i][j] = f[i - 1][j];

    cout << f[n][c] << endl;

    return 0;
}

其中,$f_{i,j}$ 表示前 $i$ 件物品恰好填满容量为 $j$ 的背包所获得的最大价值。该算法的时间复杂度是 $O(n*w)$。

最长上升子序列

给定一个序列 $a$,求其中最长的上升子序列的长度。例如,对于序列 $a = {2, 9, 3, 6, 5, 1, 7}$,其中最长的上升子序列是 ${2, 3, 5, 7}$,长度为 $4$。

下面是一个例子:

#include <bits/stdc++.h>
using namespace std;

const int N = 1e3 + 10;
int n, a[N], f[N], ans = 1;

int main() {
    cin >> n;

    for (int i = 1; i <= n; i++)
        cin >> a[i];

    for (int i = 1; i <= n; i++) {
        f[i] = 1;
        for (int j = 1; j < i; j++)
            if (a[j] < a[i])
                f[i] = max(f[i], f[j] + 1);
        ans = max(ans, f[i]);
    }

    cout << ans << endl;

    return 0;
}

其中,$f_i$ 表示以 $a_i$ 结尾的最长上升子序列的长度。该算法的时间复杂度是 $O(n^2)$。

总结

以上是动态规划的两个经典算法,它们适用于多种场景的问题。掌握动态规划算法,可以提高算法解题的效率,成为一名优秀的算法工程师。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++动态规划经典算法 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C语言+MySQL实现推箱子游戏

    C语言+MySQL实现推箱子游戏攻略 1. 实现思路 推箱子游戏是一款比较经典的游戏,本次通过使用C语言和MySQL数据库,实现游戏的记录和排行榜功能。 实现思路分为以下几步:1. 首先需要创建MySQL数据库,包含两张表,分别记录玩家信息和游戏记录信息;2. 使用C语言编写游戏程序,并实现连接MySQL数据库的功能;3. 玩家每次完成游戏后,将游戏记录信息…

    C 2023年5月22日
    00
  • C++适用入门同学的模板讲解

    关于“C++适用入门同学的模板讲解”的完整攻略,我可以为您提供以下几个方面的内容: 一、为什么需要模板 在 C++ 中,模板是一种通用的语言特性,用于实现类型无关的代码复用。模板机制可以使得我们编写精简而又高效的代码。使用模板能有效地减少代码量,并且避免了类型转换的问题,同样的代码可以适用于不同类型的数据。 二、模板的基础语法 2.1 函数模板 函数模板是定…

    C 2023年5月23日
    00
  • 谷歌Pixel C平板电脑做工怎么样?Google Pixel C拆机全过程评测图解

    谷歌Pixel C平板电脑做工怎么样? 1. 硬件外观 Pixel C的外观采用了一块10.2英寸的屏幕,分辨率为2560 x 1800,屏幕背面采用了金属材质设计,显得更加高端大气。屏幕的边框采用了比较窄的设计,让整个屏幕看起来更加大气美观。 2. 做工 Pixel C的做工非常精细,整个设备采用了一体化模具设计,不仅外观简洁大气,而且手感舒适。机身作为单…

    C 2023年5月23日
    00
  • C语言程序设计50例(经典收藏)

    “C语言程序设计50例(经典收藏)”是一本经典的编程书籍,旨在通过50个经典的C语言程序设计例子,让读者提高编程水平。本书包含了基础及进阶语言知识和常用数据结构的实现等内容,是提高编程技能的好教材。 以下是该书的完整攻略: 一、书籍概述 “C语言程序设计50例(经典收藏)”是一本C语言编程经典书籍,一共有50个程序例子,每个例子都对应着一种编程思路,适合初学…

    C 2023年5月23日
    00
  • Kotlin的枚举与异常示例详解

    Kotlin的枚举与异常示例详解 枚举(Enum) 枚举是指具有固定数量的、有限的、不同类型的值的集合,它们被定义在枚举类中。在Kotlin中,使用enum class关键字来声明一个枚举类。 声明枚举类型 下面是一个基本的颜色枚举类型的示例: enum class Color { RED, ORANGE, YELLOW, GREEN, BLUE, INDI…

    C 2023年5月22日
    00
  • C/C++中extern函数使用详解

    C/C++中extern函数使用详解 在C/C++程序中,一个函数可以被多个源文件共用,但是为了让编译器正常编译,需要对函数声明进行处理。关键字extern就是为此而生。 关键字extern extern关键字可以用来声明一个函数或者变量,它的含义是指这个函数或者变量是在另外一个文件中定义的。 当一个变量或者函数在文件A中被定义,在文件B中被引用时,如果不使…

    C 2023年5月23日
    00
  • C++日期和时间编程小结

    C++日期和时间编程小结完整攻略 本文将介绍使用C++编程语言来获取和处理日期和时间的相关技巧和知识。首先,我们需要了解C++标准库中关于日期和时间的头文件<chrono>和<ctime>。 头文件介绍 头文件\ 在C++11标准中,引入了一个新的日期和时间库<chrono>,它提供了丰富的日期和时间操作工具。通过<…

    C 2023年5月23日
    00
  • C语言 strcmp()函数

    C语言 strcmp()函数使用攻略 介绍 strcmp()函数是C语言标准库中的一员,是string.h头文件中的字符串比较函数,用于比较两个字符串是否相等。该函数会依次比较两个字符串相应位置的字符的ASCII码大小关系,直到出现不同字符或遇到字符串结束符’\0’。如果两个字符串完全相同,则该函数返回0;如果两个字符串在某个位置上出现不同,则该函数返回第一…

    C 2023年5月9日
    00
合作推广
合作推广
分享本页
返回顶部