leetcode中的DP题目总结

这篇博客总结了LeetCode中的多个动态规划(DP)题目,包括Arithmetic Slices、Guess Number Higher or Lower II、Distinct Subsequences、Triangle、Count Numbers with Unique Digits和Perfect Squares。对于每个题目,博客详细解释了DP思想,给出了注意事项和程序实现。
摘要由CSDN通过智能技术生成

[leetcode 413]Arithmetic Slices

dp解释

dp[i] 代表以 i 结尾的arithmetic slice的个数。因此有下列关系
dp[i]=dp[i1]+1,ifA[i]A[i1]=A[i1]A[i2]
dp[i]=0,ifA[i]A[i1]A[i1]A[i2]

注意

  • dp中经常会设计有以i结尾的**的个数

程序

public int numberOfArithmeticSlices(int[] A) {
        int len  = A.length;
        if(len < 3) return 0;

        int result = 0;        
        int[] dp = new int[len];

        for(int i = 1; i < len-1; i++) {
            if(A[i+1] - A[i] == A[i] - A[i-1]) {
                dp[i+1] = dp[i] + 1;
                result += dp[i+1];
            } else {
                dp[i+1] = 0;
            }

        }

        return result;        
    }

[leetcode 375] Guess Number Higher or Lower II

题目

给一个范围n,对方心里想了某个数字(范围在[1,n],具体大小你并不知道)。你每次猜一个数字,对方会告诉你猜得大了还是猜的小了或者猜对了。如果这次没有猜对,你需要支付你猜的这个数字的大小。问,给定一个范围n时,最少支付多少才能保证一定猜到这个数字呢?

解释

这个问题有点绕,然而却是一个典型的minmax问题。可以先从简单的例子来想。
在一个范围[m,n]中猜数字,
1. 如果只有一个数,比如[5,5],那么一次就会猜中,就不用支付,因此最少支付0。
2. 如果范围里有两个数,比如[5,6],你猜5如果错了,你就知道是6了,需要支付5;你猜6如果错了,同样一定会知道答案,但是需要支付6。相比之下,支付5就可以一定猜出来。
3. 如果范围里有3个数,比如[5,6,7],你猜5,那么[6,7]中猜6一定知道答案,共支付11;你猜6,[5,5]和[7,7]不用支付就可以知道答案,共支付6;你猜7,那么[5,6]需要支付5,共支付12;比较11,6,12可知,最少支付为6。
4. 一般的情况,我们不管范围里有几个数,用 dp[i][j] 来表示在 [i,j] 范围内猜数字,最难猜到的数字让我们支付了多少(最少支付了多少可以保证猜到这个范围内的任何数字)。这相当于,如果我们猜任何一个 k[i,j] ,一定会得到需要猜的数字的是在

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值