[leetcode 413]Arithmetic Slices
dp解释
dp[i] 代表以 i 结尾的arithmetic slice的个数。因此有下列关系
dp[i]=0,ifA[i]−A[i−1]≠A[i−1]−A[i−2]
注意
- 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] ,一定会得到需要猜的数字的是在