LintCode Guess Number Game II

来源:互联网 发布:马尔科夫转移矩阵 编辑:程序博客网 时间:2024/06/07 02:34

二分法,这道题还是有难度的!

class Solution {  public:      int getMoneyAmount(int n) {          vector<vector<int>> dp(n+1, vector<int>(n+1, 0));          //创建装有n+1个容器的容器,该容器所装容器的初始值为n+1个0;        for(int i = n-1; i > 0; i--)          {              for(int j = i+1; j <=n; j++)              {                  int ans = INT_MAX;  //无穷大                for(int k = i; k <j; k++)                      ans = min(ans, k + max(dp[i][k-1], dp[k+1][j]));                  dp[i][j] = ans;              }          }          return dp[1][n];      }  };

另一种方法

class Solution {  public:      int DFS(vector<vector<int>> &dp, int left, int right)      {          if(left >= right) return 0;          if(dp[left][right]) return dp[left][right];          int ans = INT_MAX;          for(int i = left; i <= right; i++)              ans = min(ans, i + max(DFS(dp, left, i-1), DFS(dp, i+1, right)));          return dp[left][right]=ans;      }      int getMoneyAmount(int n) {          if(n ==0) return 0;          vector<vector<int>> dp(n+1, vector<int>(n+1, 0));          return DFS(dp, 1, n);      }  };