动态规划 - 收集雨水

该代码实现了一个Java方法,用于解决‘接雨水’问题。通过构造一个二维dp数组,计算在不同高度位置能接收到的雨水总量。算法遍历输入的高度数组,更新最大高度,并根据当前高度计算所能容纳的雨水,结合前一高度的dp值,得出当前dp[i][j]的值。最后返回最高高度处的dp值作为总雨水量。
摘要由CSDN通过智能技术生成
public class TrappingRainWater {

    public static int trw(int[] heights) {
        if (heights == null || heights.length <= 1) {
            return 0;
        }

        int maxHeight = 0;
        for (int height : heights) {
            if (height > maxHeight) {
                maxHeight = height;
            }
        }

        int [][] dp = new int[maxHeight+1][heights.length+1];

        // i for height
        for (int i = 1; i <= maxHeight; i++) {
            // j for position
            int start = 0;
            int curLineLen = 0;
            for (int j = 1; j <= heights.length; j++) {
                if (heights[j-1] >= i) {
                    if (start != 0) {
                        curLineLen += (j - start - 1);
                    }
                    start = j;
                }
                dp[i][j] = curLineLen + dp[i-1][j];
            }
        }

        return dp[maxHeight][heights.length];
    }

    public static void main(String[] args) {

        System.out.println(trw(new int[]{0,1,0,2,1,0,1,3,2,1,2,1}));
        System.out.println(trw(new int[]{4,2,0,3,2,5}));


    }

}

解题思路:

构造dp数组, dp[i][j]代表i高度,j位置能收集到的雨水之和

  1. i高度,j位置能收集到的雨水之和可拆分为2部分:

① 当前高度i,这一行能收集的雨水之和。

计算方式为从第1个位置记录高度大于i的位置, 每2个位置之间的空格数,即为这2个位置之间能容纳的雨水数。 从前向后遍历, 可容纳的雨水数累加即为此高度当前位置能容纳的最大雨水数。

② 比i高度低的j位置能容纳的雨水之和, 即 dp[i-1][j]

  1. 1.①与1.②之和, 即为i高度/j位置的最大雨水数量 dp[i][j]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值