1105 Filling Bookcase Shelves 填充书架

21 篇文章 0 订阅

题目 https://leetcode.com/problems/filling-bookcase-shelves/

题目意思是,给你一个固定宽度的书架,很多本书,每本书有个宽度和高度,书架可以有很多层,每层可以放n本书(宽度之和小于等于书架宽度),合理摆放书籍,使得书架高度最小

public int minHeightShelves(int[][] books, int shelf_width) {
   }

动态规划:

dp[n=书本个数],初始化赋值很大,dp[i]代表,把第i本书放好后最低的高度。

dp[0]=book[0][1];只有一本书,书架高度就是书的高度。

 得到转换公式的思路:

对于第i本书,前i-1本书已经放好了,我们不知道第i本书需不需要和前面的书放在一层。

所以,在到i本书的时候,从第j=i本开始,向前遍历,i-1,i-2.....0.把第i本书和前面书放在一起,只要能放的下,同时取得这j到i本书中的最高高度,当作第i本书所在书架层的高度,则公式为:dp[i]=Math.min(dp[j-1]+maxheight,dp[i]);表示从j ---> i本书可以放在一起,0到j-1是按照dp[j-1]方式放得到最小高度+加上当前层高度和之前dp[i]比较。

int len=books.length;
        if(len<1)return 0;
        int dp[]=new int[len];
        Arrays.fill(dp,10000);
        dp[0]=books[0][1];
        for(int i=1;i<len;i++){
            int max_height=0;
            int used_width=0;
            for(int j=i;j>=0&&used_width<=shelf_width;j--){
                max_height=Math.max(max_height,books[j][1]);
                used_width=used_width+books[j][0];
                if(used_width<=shelf_width){//表示前面j-1本放的方式已经最小+当前j--i本放在一起,取得最小高度,这里就是要看j什么时候取得全局最小高度。所以j遍历到0
                    if(j==0){//第一本书前面没有了,dp[j-1]=0
                        dp[i]=Math.min(dp[i],max_height);
                    }else {
                        dp[i] = Math.min(dp[j - 1] + max_height, dp[i]);
                    }
                }
            }
        }
        return dp[len-1];

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值