iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ 动态规划算法使用分析
  • 540
分享到

C++ 动态规划算法使用分析

2024-04-02 19:04:59 540人浏览 薄情痞子
摘要

目录Fibonacci字符串分割(Word Break)三角矩阵(Triangle)路径总数(Unique Paths)最小路径和(Minimum Path Sum)Fibonacc

Fibonacci

题目描述:

大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项。

解题思路:

1.递归

2.动态规划

状态:F(n)

状态递推:F(n)=F(n-1)+F(n-2)

初始值:F(1)=F(2)=1

返回结果:F(N)

代码实现:

法一:递归(效率低):


class Solution{public: int Fibonacci(int n)
{        // 初始值 
	if (n <= 0)
	{ 
		return 0; 
	} 
	if (n == 1 || n == 2) 
	{
		return 1; 
	}        
	// F(n)=F(n-1)+F(n-2) 
	return Fibonacci(n - 2) + Fibonacci(n - 1); }};

法二:动态规划


class Solution {
public:
    int Fibonacci(int n) {
        if(n==1 || n==2)
            return 1;
        int fn;
        int fn1 = 1, fn2 = 1;
        for(int i = 2; i < n; i++)
        {
            fn = fn1 + fn2;
            fn1 = fn2;
            fn2 = fn;
        }
        
        return fn;
        
        if(n==1 || n==2)
            return 1;
        int* F = new int[n];
        //初始状态
        F[0] = 1;
        F[1] = 1;
        for(int i = 2; i < n; i++)
        {
            F[i] = F[i-1] + F[i-2];
        }
        
        return F[n-1];
    }
};

字符串分割(Word Break)

题目描述:

给定一个字符串s和一组单词dict,判断s是否可以用空格分割成一个单词序列,使得单词序列中所有的单词都是dict中的单词(序列可以包含一个或多个单词)。

例如:

给定s=“nowcode”;

dict=[“now”, “code”].

返回true,因为"nowcode"可以被分割成"now code".

解题思路:

状态:

  • 子状态:前1,2,3,…,n个字符能否根据词典中的词被成功分词
  • F(i): 前i个字符能否根据词典中的词被成功分词

状态递推:

  • F(i): true{j <i && F(j) && substr[j+1,i]能在词典中找到} OR false 在j小于i中,只要能找到一个F(j)为true,并且从j+1到i之间的字符能在词典 中找到,则F(i)为true

初始值:

  • 对于初始值无法确定的,可以引入一个不代表实际意义的空状态,作为状态的起始 空状态的值需要保证状态递推可以正确且顺利的进行,到底取什么值可以通过简单的例子进行验证 F(0) = true

返回结果:F(n)

代码实现:


class Solution {
public:
    bool wordBreak(string s, unordered_set<string> &dict) {
        int len = s.size();
        vector<bool> F(len+1, false);
        F[0] = true;
        for(int i = 1; i <= len; i++)
        {
            //F[8]的状态:7<8 && F[7] && [8,8]
            //F[8]的状态:6<8 && F[6] && [7,8] 
            for(int j = i-1; j >= 0; j--)
            {
                if(F[j] && dict.find(s.substr(j,i-j)) != dict.end())
                {
                    F[i] = true;
                    break;
                }
            }
        }
        
        return F[len];
    }
};

三角矩阵(Triangle)

题目描述:

给出一个三角形,计算从三角形顶部到底部的最小路径和,每一步都可以移动到下面一行相邻的数字

例如,给出的三角形如下:

[[20],[30,40],[60,50,70],[40,10,80,30]]

解题思路:

状态:子状态:从(0,0)到(1,0),(1,1),(2,0),…(n,n)的最短路径和 F(i,j): 从(0,0)到(i,j)的最短路径和

状态递推: F(i,j) = min( F(i-1, j-1), F(i-1, j)) + triangle[i][j]

初始值: F(0,0) = triangle[0][0]返回结果: min(F(n-1, i))

代码实现:


class Solution {
public:
    int minimumTotal(vector<vector<int> > &triangle) {
        if(triangle.empty())
            return 0;
        int row = triangle.size();
        vector<vector<int> > minSum(triangle);
        for(int i = 1; i < row; i++)
        {
            for(int j = 0; j <= i; j++)
            {
                if(j == 0)
                    minSum[i][j] = minSum[i-1][j] + triangle[i][j];
                else if(j == i)
                    minSum[i][j] = minSum[i-1][j-1] + triangle[i][j];
                else
                    minSum[i][j] = min(minSum[i-1][j], minSum[i-1][j-1])
                                   + triangle[i][j];
            }
        }
        int result = minSum[row-1][0];
        for(int i = 1; i < triangle.size(); i++)
        {
            result = min(result, minSum[row-1][i]);
        }
        
        return result;
    }
};

路径总数(Unique Paths)

题目描述:

一个机器人在m×n大小的地图的左上角(起点)。 机器人每次可以向下或向右移动。机器人要到达地图的右下角(终点)。 可以有多少种不同的路径从起点走到终点?

解题思路:

状态:子状态:从(0,0)到达(1,0),(1,1),(2,1),…(m-1,n-1)的路径数 F(i,j): 从(0,0)到达F(i,j)的路径数

状态递推: F(i,j) = F(i-1,j) + F(i,j-1)

初始化: 特殊情况:第0行和第0列 F(0,i) = 1 F(i,0) = 1

返回结果: F(m-1,n-1)

代码实现:


class Solution {
public:
    
    int uniquePaths(int m, int n) {
        // write code here
        vector<vector<int> > ret(m, vector<int>(n,1));
        for(int i = 1; i < m; i++)
        {
            for(int j = 1; j < n; j++)
            {
                ret[i][j] = ret[i-1][j] + ret[i][j-1];
            }
        }
        
        return ret[m-1][n-1];
    }
};

最小路径和(Minimum Path Sum)

题目描述:

给定一个由非负整数填充的m x n的二维数组,现在要从二维数组的左上角走到右下角,请找出路径上的所有数字之和最小的路径。 注意:你每次只能向下或向右移动。

解题思路:

状态:子状态:从(0,0)到达(1,0),(1,1),(2,1),…(m-1,n-1)的最短路径 F(i,j): 从(0,0)到达F(i,j)的最短路径。

状态递推: F(i,j) = min{F(i-1,j) , F(i,j-1)} + (i,j)

初始化: F(0,0) = (0,0) 特殊情况:第0行和第0列 F(0,i) = F(0,i-1) + (0,i) F(i,0) = F(i-1,0) + (i,0)

返回结果: F(m-1,n-1)

代码实现:


class Solution {
public:
    
    int minPathSum(vector<vector<int> >& grid) {
        // write code here
        if(grid.size() == 0 || grid[0].size() == 0)
            return 0;
        int M = grid.size();
        int N = grid[0].size();
        vector<vector<int> > ret(M, vector<int>(N,0));
        ret[0][0] = grid[0][0];
        for(int i = 1; i < N; i++)
        {
            ret[0][i] = ret[0][i-1] + grid[0][i];
        }
        for(int i = 1; i < M; i++)
        {
            ret[i][0] = ret[i-1][0] + grid[i][0];
        }
        for(int i = 1; i < M; i++)
        {
            for(int j = 1; j < N; j++)
            {
                ret[i][j] = min(ret[i-1][j],ret[i][j-1]) + grid[i][j];
            }
        }
        
        return ret[M-1][N-1];
    }
};

到此这篇关于c++ 动态规划算法使用分析的文章就介绍到这了,更多相关C++ 动态规划内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++ 动态规划算法使用分析

本文链接: https://www.lsjlt.com/news/143817.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ 动态规划算法使用分析
    目录Fibonacci字符串分割(Word Break)三角矩阵(Triangle)路径总数(Unique Paths)最小路径和(Minimum Path Sum)Fibonacc...
    99+
    2024-04-02
  • C++动态规划算法如何使用
    这篇“C++动态规划算法如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++动态规划算法如何使用”文章吧。Fibon...
    99+
    2023-06-29
  • c++动态规划经典算法
    目录基本思想重要分析问题方法动态规划算法实例1、台阶问题2、从矩阵左上角走到右下角最短路径问题3、最大子数组问题4、最长公共子序列基本思想    &nb...
    99+
    2024-04-02
  • java背包问题动态规划算法分析
    背包问题 【题目描述】 一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,…,WnW1,W2,…,Wn,它们的价值分别为C1,C2,…,C...
    99+
    2024-04-02
  • python动态规划算法怎么用
    小编给大家分享一下python动态规划算法怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!python有哪些常用库python常用的库:1.requesuts;2.scrapy;3.pillow;4.twisted;5...
    99+
    2023-06-14
  • c语言动态规划算法是什么
    C语言动态规划算法是一种用于解决优化问题的算法。它通过将问题划分为子问题,并保存子问题的解来避免重复计算,从而提高算法的效率。动态规...
    99+
    2023-08-18
    c语言
  • 怎么使用C++动态规划算法实现矩阵链乘法
    这篇文章主要介绍“怎么使用C++动态规划算法实现矩阵链乘法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用C++动态规划算法实现矩阵链乘法”文章能帮助大家解决问题。问题描述:给定n个矩阵的链&...
    99+
    2023-07-02
  • C++动态规划算法实现矩阵链乘法
    问题描述: 给定n个矩阵的链<A1,A2,…,An>,矩阵Ai的规模为p(i-1)×p(i) (1<=i<=n),求完全括号化方案,...
    99+
    2024-04-02
  • 60题学会动态规划系列:动态规划算法第三讲
    简单多状态问题 文章目录 一.按摩师二.打家劫舍系列三.删除并获得点数四.粉刷房子 1.按摩师 力扣链接:力扣 一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因...
    99+
    2023-10-05
    c++ 后端 算法 动态规划 力扣
  • Java矩阵连乘问题(动态规划)算法实例分析
    本文实例讲述了Java矩阵连乘问题(动态规划)算法。分享给大家供大家参考,具体如下:问题描述:给定n个矩阵:A1,A2,...,An,其中Ai与Ai+1是可乘的,i=1,2...,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连...
    99+
    2023-05-30
    java 矩阵 算法
  • 怎么使用C++动态规划计算最大子数组
    本文小编为大家详细介绍“怎么使用C++动态规划计算最大子数组”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用C++动态规划计算最大子数组”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。例题题目:输入一个整形...
    99+
    2023-07-02
  • C++ 递归函数在动态规划算法中的应用?
    动态规划算法中使用递归函数可以有效解决最优化问题。示例是斐波那契数列求解,递归函数基于公式 f(n) = f(n-1) + f(n-2)。可以通过使用备忘录技术优化递归函数,将子问题解决...
    99+
    2024-04-24
    c++ 递归
  • C++动态规划计算最大子数组
    目录例题1.求最大的子数组的和2.求和最大的相应子数组例题 题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组...
    99+
    2024-04-02
  • 【路径规划】局部路径规划算法——DWA算法(动态窗口法)|(含python实现 | c++实现)
    文章目录 参考资料1. DWA算法原理1.1 简介1.2 算法原理1. 速度采样2. 轨迹预测(轨迹推算)3. 轨迹评价 2. Python实现2.1 参数配置2.2 机器人运动学模...
    99+
    2023-08-31
    python 机器人 路径规划 DWA 动态窗口法
  • java动态规划方法怎么使用
    这篇文章主要介绍了java动态规划方法怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java动态规划方法怎么使用文章都会有所收获,下面我们一起来看看吧。说明动态规划是一种编程原理,可以通过将非常复杂的问...
    99+
    2023-06-30
  • 基本算法思想:递归+分治+动态规划+贪
    作者:心叶时间:2018-05-01 19:28 本文对应github地址:https://github.com/yelloxing/... 以上实现了常见算法的java、c语言、javascrpt(或node.js)、python3和g...
    99+
    2023-01-31
    递归 算法 思想
  • JavaScript程序设计高级算法之动态规划的示例分析
    这篇文章给大家分享的是有关JavaScript程序设计高级算法之动态规划的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:其实像在我们前端的开发中,用到的高级算法...
    99+
    2024-04-02
  • C++中的动态规划子序列问题分析探讨
    目录一、子序列(不连续)最长上升子序列最长公共子序列不相交的线二、子序列(连续)最长连续递增序列最长重复子数组最大子序和三、编辑距离判断子序列两个字符串的删除操作不同的子序列编辑距离...
    99+
    2023-03-15
    C++动态规划子序列 C++子序列问题 C++动态规划
  • Java使用动态规划算法思想解决背包问题
    目录动态规划算法动态规划算法的思想最优性原理动态规划算法的三大特点动态规划算法中的0/1背包问题动态规划算法的优点小结动态规划算法 动态规划算法的思想 动态规划算法处理的对象是多阶段...
    99+
    2024-04-02
  • C++编辑距离(动态规划)
    题目描述: 给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。 我们可以对一个单词进行如下三种操作: 插入一个字符删除一个...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作