动态规划算法总结

1、股票最大利润问题
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?
示例 1:

输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 =
6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。

class Solution {
    public int maxProfit(int[] prices) {
        int profit = 0;
        int cost = Integer.MAX_VALUE;
        for(int price :prices){
            cost = Math.min(price,cost);
            profit = Math.max(profit,price-cost);
        }
        return profit;
    }
}

思路:
一、状态:在第i天卖出所能得到的最大利润
二、转移方程:dp[i] = max(第i天之前所能得到的最大利润,第i天卖出的价格-第i天之前的最低价格)
三、dp[i]初始化
四、确定遍历顺序
五、举例推导dp数组

2、礼物的最大价值
在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?

示例 1:

输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 12 解释: 路径 1→3→5→2→1
可以拿到最多价值的礼物

class Solution {
    public int maxValue(int[][] grid) {
       
        int rowLength = grid.length;
        int columnLength = grid[0].length;
        for(int i=1;i<columnLength;i++){
            grid[0][i] += grid[0][i-1];
        }
        for(int i=1;i<rowLength;i++){
            grid[i][0] += grid[i-1][0];
        }
        for(int i=1;i<rowLength;i++)
            for(int j=1;j<columnLength;j++)
              grid[i][j] += Math.max(grid[i-1][j],grid[i][j-1]);
        return grid[rowLength-1][columnLength-1];
    }
}

状态:以grid[i][j]结尾所能得到的最大礼物价值
转移方程:grid[i][j] = max(从上或左所能得到的最大礼物价值)+自身礼物价值
初始化:边缘处没有上或左,应特殊对待先进行初始化
dp[i]遍历顺序

总结:动态规划类算法题的特征是求最值,对于状态的定义一般是在某点处所能取到的最值,一般无需创建新的数组用以存储某点最值,一般对原数组进行修改即可。某点处的极值未必是根据它邻近点的极值所得到的(例1不是,例2是)。一般是通过定义局部变量max对某点之前的最值进行存储,若最值有变化则再对max进行赋值,最后遍历完成后返回max值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值