问题:
给出数字n,在1~n中,假设设定了一个数字x让你猜,你猜一个y,如果错误,那就收取¥y的费用,并告诉你x与y的大小关系。求出在1~n中,在最佳策略下猜出一个x至少要花费多少。(考虑所有情况)
思路:
这里用到了DP问题的解决思想。通过遍历猜所有数字的情况,例如n为5,猜3,那么就将问题分成,猜1~2和4~5这两个情况的最优花费(这两个子问题)再加上3的消耗。再对比一个本次最优值,记录下这麽猜的最优值,以便复用。
代码:
1 class Solution { 2 public: 3 int getMoneyAmount(int n) { 4 int** status = new int*[n + 1]; 5 for (int i = 0; i <= n; i++) { 6 status[i] = new int[n + 1]; 7 } 8 return dp(status, 1, n); 9 } 10 11 int dp(int** status, int start, int end) { 12 if (start >= end) return 0; 13 if (status[start][end] != 0) return status[start][end]; 14 int local_min = INT_MAX; 15 for (int i = start; i <= end; i++) { 16 int tmp = i + max(dp(status, start, i - 1), dp(status, i + 1, end)); 17 local_min = min(local_min, tmp); 18 } 19 status[start][end] = local_min; 20 return local_min; 21 } 22 };
原文地址:https://www.cnblogs.com/leo-lzj/p/10331533.html
时间: 2024-11-05 18:51:26