1.猜数字大小
这道题要考动态规划
dp[i][j]表示的是 从i 到j 要花多少钱
选项有选两个边值 也可以选中间的任何值 所以来找出需要的最大花费
注意1.要注意虽然求的是最大花费,但是是考虑策略的 不是毫无目的的刻意最大 要考虑到因为我们猜是只能去猜最大 或者最小的 还有中间的某一个值 要求其中的最小的 但我们没法确定目标值是在左还是右 所以要求左右花费的最大值
注意2:动态规划求最值的时候必须从基础到上层 从简单情况到目标情况 对于这个题来说的话就是先计算左右比较短的情况 在考虑长的 整个的情况
class Solution {
public:
int getMoneyAmount(int n) {
if(n==1){
return 0;
}
vector<vector<int>>dp(n,vector<int>(n,0));
for(int len=2;len<=n;len++){
for(int i=0;i<=n-len;i++){
int j=i+len-1;
for(int k=i;k<=j;k++){
if(k==i){
dp[i][j]=i+1+dp[i+1][j];
}
else if(k==j){
dp[i][j]=min(dp[i][j],dp[i][j-1]+j+1);
}
else {
dp[i][j]=min(dp[i][j],max(dp[i][k-1],dp[k+1][j])+k+1);
}
}
}
}
return dp[0][n-1];
}
};
2.最大子矩阵