354. Russian Doll

本文介绍了一个典型的动态规划问题——信封套叠问题的解决方案。通过将信封按宽度排序,并利用动态规划算法求解能获得的最大信封套叠数量。代码实现了排序与动态规划的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

典型的dp,注意点的程序中已经标出:

public class Solution {
    //State: Sort envelopes' width, f[i] is maximum number of envelopes number i envelope can get;
    //Function: f[i] = Math.max(f[i - k] + 1) if Size(i - k) < size(i);
    //Initialize: f[i] = 1;
    //Result: Max(f[i]);
    public int maxEnvelopes(int[][] envelopes) {
        if (envelopes == null || envelopes.length == 0 || envelopes[0].length == 0) {
            return 0;
        }
        //按信封的width先排个序,方便后面的计算
        Arrays.sort(envelopes, new Comparator<int[]>() {
            public int compare(int[] x, int[] y) {
                return x[0] - y[0];
            }
        });
        
        int[] f = new int[envelopes.length];
        //这里所有的一个信封都可以独立地表示包含一个信封,所以初始化值为1
        Arrays.fill(f, 1);
        int result = 0;
        for (int i = 0; i < envelopes.length; i++) {
            for (int k = i - 1; k >= 0; k--) {
                //因为array.sort后,还会存在width相同的情况,所以操作之前要先判断width是不是严格小于现有的信封
                if (envelopes[k][0] < envelopes[i][0] && envelopes[k][1] < envelopes[i][1]) {
                    f[i] = Math.max(f[i], f[k] + 1);
                }
            }
            result = Math.max(result, f[i]);
        }
        
        return result;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值