猜数-Minmax
题目:375. Guess Number Higher or Lower II
给定数字x在1到n之间,每次猜x的值,可以知道较大或较小,如果没有猜中,则需要付出x元的代价,求保证猜中的代价
解:其实是最坏情况下的最优决策问题,转移方程:
f(i,j) = until i>=j min(x+max{f(i,x-1),f(x+1,j)}) for x in [i,j]
class Solution {
int[][] dp;
public int getMoneyAmount(int n) {
dp = new int[n][n];
for(int i=0;i<n;++i)Arrays.fill(dp[i],-1);
return f(1,n);
}
int f(int i,int j){
if(i>=j)return 0;
if(dp[i-1][j-1]!=-1)return dp[i-1][j-1];
int mx = i+f(i+1,j);
for(int k=i+1;k<=j;++k){
mx = Math.min(mx, k+ Math.max(f(i,k-1),f(k+1,j)));
}
return dp[i-1][j-1]=mx;
}
}
除此之外,我们还可以根据代价衡量能够猜的值的范围。
TODO
f(i,j,t)