1.
一个N层的大厦,你手中有M个相同的玻璃球。从这个大厦的某一层扔下就会碎,用你手中的这些玻璃球,找出一个最优的策略,来得知那个临界层面
input:
100 2
100 3
300 3
output:
14
9
13
import java.util.Scanner;
public class Main {
private static int[][] dp;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
int m = sc.nextInt();
int temp;
dp = new int[n + 1][m + 1];
for (int i = 1; i <= n; i++)
dp[i][1] = i;
for (int i = 1; i <= m; i++)
dp[1][i] = 1;
for (int i = 2; i <= n; i++) {
for (int j = 2; j <= m; j++) {
int min = Integer.MAX_VALUE;
for (int r = 1; r <= i; r++) {
temp= Math.max(dp[i - r][j], dp[r - 1][j - 1]) + 1;
if (min > temp)
min = temp;
}
dp[i][j] = min;
}
}
System.out.println(dp[n][m]);
}
}
}
假设n层楼第i层抛了1个球,还有j个球
(1)球碎
此时,第i-1层中必有临界层,为少一个球少一层时的最优解加上这次抛球
dp[i][j]=dp[i-1][j-1]+1;
(2)球完整,临界层在i到n中
dp[i][j]=dp[n-i][j]+1
所以最优策略为dp[i][j]=min{max{dp[i-1][j-1],dp[n-i][j]}+1}
2.边界条件
dp[1][j]=1;
dp[i][1]=i;