【算法】详解动态规划

【算法】详解动态规划nbsp nbsp 首先学习动态规划 我们的先知道什么是动态规划 算法导论这本书是这样介绍这个算法的 动态规划与分治方法类似 都是通过组合子问题的解来来求解原问题的 再来了解一下什么是分治方法 以及这两者之间的差别 分治方法将问题划分为互不相交的子问题 递归的求解子问题 再将它们的解组合起来 求出原问题的解 而动态规划与之相反 动态规划应用与子问题重叠的情况 即不同的子问题具有公共的子子问

class Solution { public: int Fibonacci(int n) { if(n<=0) return 0; if(n == 1 || n == 2) return 1; return Fibonacci(n-1)+Fibonacci(n-2); } }; 
class Solution { public: int Fibonacci(int n) { //先申请一个空间来保存解 vector 
  
    f(n + 1, 0); //初始化 f[0] = 0; if (n <= 0) return f[0]; f[1] = 1; if (n == 1) return f[1]; f[2] = 1; //状态递推 for (int i = 3; i <= n; i++) { f[i] = f[i - 1] + f[i - 2]; } //返回结果 return f[n]; } }; 
  
class Solution { public: int Fibonacci(int n) { if (n <= 0) return 0; if(n == 1 || n == 2) return 1; //初始化 int fn1 = 0; int fn2 = 1; int result = 0; for (int i = 2; i <= n; i++) { //递推公式 result = fn1 + fn2; fn1 = fn2; fn2 = result; } //返回结果 return result; } }; 
class Solution { public: int jumpFloorII(int number) { if (number <= 0) return 0; //初始化 int total = 1; for (int i = 1; i < number; i++) { //递推 total = 2 * total; } //返回结果 return total; } }; 
class Solution { public: int rectCover(int number) { if (number <= 0) return 0; if (number == 1) return 1; if (number == 2) return 2; vector 
  
    f(number + 1, 0); //初始化 f[0] = 0; f[1] = 1; f[2] = 2; for (int i = 3; i <= number; i++) { //状态递推 f[i] = f[i - 1] + f[i - 2]; } //返回结果 return f[number]; } }; 
  

给定一个int数组A和数组大小n,请返回最大的连续数列的和。保证n的大小小于等于3000。

class MaxSum { public: int getMaxSum(vector 
  
    A, int n) { // write code here if (A.empty()) return 0; vector 
   
     f(A.size(), 0); //初始化 f[0] = A[0]; for (int i = 1; i < A.size(); i++) { //状态递推 f[i] = max(f[i - 1] + A[i], A[i]); } //输出结果 int result = A[0]; for (int i = 0; i < A.size(); i++) { result = max(f[i], result); } return result; } }; 
    
  

Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.

class Solution { public: bool wordBreak(string s, unordered_set 
  
    &dict) { if (s.empty() || dict.empty()) return false; int n = s.size(); vector 
   
     can_break(n + 1, false); //初始化 can_break[0] = true; //递推 for (int i = 1; i <= n; i++) for (int j = 0; j < i; j++) { if (can_break[j] && dict.find(s.substr(j,i-j)) != dict.end()) { can_break[i] = true; break; } } return can_break[n]; } }; 
    
  

Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.

For example, given the following triangle

The minimum path sum from top to bottom is11(i.e., 2 + 3 + 5 + 1 = 11).

class Solution { public: int minimumTotal(vector 
  
    > &triangle) { if (triangle.empty()) return 0; vector 
   
     > min_sum(triangle); //初始化 min_sum[0][0] = triangle[0][0]; //递推 for (int i = 1; i < triangle.size(); i++) { for (int j = 0; j <= i; j++) { //左边界 if (j == 0) { min_sum[i][j] = min_sum[i - 1][j] + triangle[i][j]; } //右边界 else if (j == i) { min_sum[i][j] = min_sum[i - 1][j - 1] + triangle[i][j]; } //中间 else { min_sum[i][j] = min(min_sum[i - 1][j - 1], min_sum[i - 1][j]); min_sum[i][j] = min_sum[i][j] + triangle[i][j]; } } } int line = triangle.size(); int result = min_sum[line - 1][0]; for (int i = 1; i < line; i++) { result = min(result, min_sum[line - 1][i]); } //返回结果 return result; } }; 
    
  
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/209876.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午8:16
下一篇 2026年3月19日 上午8:16


相关推荐

  • mysql 主键自增语句_MySQL 自增主键[通俗易懂]

    mysql 主键自增语句_MySQL 自增主键[通俗易懂]以下仅考虑InnoDB存储引擎。自增主键有两个性质需要考虑:单调性每次插入一条数据,其ID都是比上一条插入的数据的ID大,就算上一条数据被删除。连续性插入成功时,其数据的ID和前一次插入成功时数据的ID相邻。自增主键的单调性为何会有单调性的问题?这主要跟自增主键最大值的获取方式,以及存放位置有关系。如果最大值是通过计算获取的,并且在某些情况下需要重新获取时,会因为最新的数据被删…

    2022年6月30日
    34
  • fork函数详解

    fork函数详解首先了解什么是 fork 一个进程 包括代码 数据和分配给进程的资源 fork 函数通过系统调用创建一个与原来进程几乎完全相同的进程 也就是两个进程可以做完全相同的事 但如果初始参数或者传入的变量不同 两个进程也可以做不同的事 一个进程调用 fork 函数后 系统先给新的进程分配资源 例如存储数据和代码的空间 然后把原来的进程的所有值都复制到新的新进程中 只有少数值与原来的进程的值不同 上面的话通俗理解就是 fork 是复制进程的函数 程序一开始就会产生一个进程 当这个进程 代码 执行到 fork

    2026年3月20日
    1
  • 背包问题-动态规划java实现代码

    背包问题-动态规划java实现代码背包问题-动态规划背包问题是如今面试流行的面试题之一,我们可用动态规划解题

    2022年7月26日
    19
  • vector二维数组初始化赋值_vector实现二维数组的赋值

    vector二维数组初始化赋值_vector实现二维数组的赋值一。二维vector初始化1.采用构造函数vector&lt;vector&lt;int&gt;&gt;vec(10,vector&lt;int&gt;(8));//10行8列,全部初始化为零2.添加元素(每次添加一行)inta[]={1,2,3,4};vector&lt;int&gt;ivec(a,a+4);//数组初始化vector,见最下面(…

    2026年1月17日
    3
  • WPF Visifire 入门-动态曲线图[通俗易懂]

    WPF Visifire 入门-动态曲线图[通俗易懂]kagula2019-3-18这里用源代码的形式,示范如何画出一个最简单的动态曲线图。开发环境,Visualstudio2017CommunityUpdate5项目类型:WPFC#.NetFramework4.6.1本文适用对象:有两年没有开发C#WPF的程序员,通过这个示例可以快速回忆。下面是运行效果图,不停显示最新生成的十个数据点。让…

    2022年7月21日
    15
  • wxPython的简单应用

    wxPython的简单应用

    2021年11月22日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号