动态规划算法笔记

目录

Floyd算法 动态规划算法

动态规划系列---求数组中两个元素差的最大值


Floyd算法 动态规划算法

Floyd在1962年由Robert Floyd以其当前公认的形式出版。算法作为三个嵌套for循环的现代公式首先由Peter Ingerman在1962年描述。Floyd 算法是解决图论问题的比较经典的算法,是解决给定的加权图中顶点间的最短路径的一种算法,可以正确处理有向图的最短路径问题。

   Floyd算法是一种动态规划算法,节点间的连接权值可正可负。此算法简单有效,在稠密地图中效果最佳。由于三重循环结构紧凑,在稠密图中效率要高于Dijkstra算法。

   Floyd 算法优点主要体现在 ① 算法简单,容易理解,且代码编写简单。②可以算出任意两个节点之间的最短距离,这是很多路径规划算法所不具有的优势。

   Floyd 算法缺点主要体现在∶时间复杂度比较高,对于稀疏图将会生成稀疏矩阵,极大浪费了储存空间。
                        
原文链接:https://blog.csdn.net/qq_44339029/article/details/127043021

Floyd (弗洛伊德)算法简述_弗洛伊德算法-CSDN博客

动态规划系列---求数组中两个元素差的最大值

题目

求数组中两个元素差的最大值(后面的元素减去前面的元素);对应实际生活中的股票买卖,找出一只股票走势里面可能的最大收益;

思路

类似于求数组连续和的最大值; 
保存最大差值和最小值,遍历数组,如果当前元素-min>最大差值,则更新最大差值;如果当前元素<最小值,则更新最小值;

实现

public static int max_difference(int[] a){
        int len=a.length;
        if(len<2){
            return 0;
        }
        int min=Math.min(a[0], a[1]);
        int max_diff=a[1]-a[0];
        for(int i=2;i<len;i++){
            if(a[i]-min>max_diff){
                max_diff=a[i]-min;
            }
            if(a[i]<min){
                min=a[i];
            }
        }
        return max_diff;
    }c版本:

一个整数数组a[n],在a[n]中找两个数字,使得下标大的数字减去下表小的数字所得的差值最大,即:
在a[n]中找 a[i] 和 a[j] ,使得 a[i] - a[j] 的值最大,并且 i > j 。 题目来自这里

寻求O(n)的解法,思路:

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a[]={-1, -2, -3, -1};
    int n = sizeof(a) / sizeof(a[0]);
    int min, r;  // min当前最小值, r最终要求的结果  
    int i;
    
    min = a[0] < a[1] ? a[0] : a[1]; 
    r = a[1] - a[0];
    for (i = 2; i < n; i++)
    {
        if (a[i] - min > r)
            r = a[i] - min;
        if (a[i] < min)
            min = a[i];
    }
    printf("%d\n", r);
    return 0;
}

记录已经遍历的元素中的最小值min和当前所求的最大差值r,然后继续遍历下一个元素。

首先和当前最小值min求差,如果比r大,则更新r。

其次,跟当前最小值min比较,如果小于min,则更新min。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI算法网奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值