leetcode用のnumberguessサイズ1/2(二点374、375、ダイナミックプログラミング間隔)

374のゲスサイズ

トピック説明:私たちは推測ゲームをプレイしています。ゲームのルールは、以下のようにしている:
I 1からnまでの番号を選択します。私はあなたがどの番号を選択する必要がありますね。あなたは間違って推測するたびに、私はこの数字が大きいか小さいあなたを教えてあげましょう。あなたは、事前に定義されたインターフェイスは、(int型NUM)推測を呼び出し、それは3つの可能な結果(-1、1または0)を返します:-1:私の図は、比較的小さい; 1:私は、大きな図; 0:おめでとうございます!あなたはそれを推測しました!
アイデア:半分推測。

// Forward declaration of guess API.
// @param num, your guess
// @return -1 if my number is lower, 1 if my number is higher, otherwise return 0
int guess(int num);

int ABC(int n);

class Solution {
public:
    int guessNumber(int n) {
        long long low = 1, high = n, mid = 0;
        int ans = 0;
        while(low <= high) {
            mid = (low + high) / 2;
            if(guess(mid) <= 0) {
                ans = mid;
                high = mid - 1;
            }
            else
                low = mid + 1;
        }
        return ans;
    }
};

375ゲスサイズ2

トピック説明:私たちは推測ゲームをプレイしている、ゲームのルールは次の通りです:
私は1からnまでの番号を選択し、あなたは私が選んだものを数を推測します。あなたは間違って推測するたびに、私は私があなたの大小よりも数字を選んだ、あなたを教えてくれます。あなたが現金の有料x量に必要がある場合しかし、あなたは、デジタルXとして間違って推測したとき。私はあなたが数字を選択するまで、あなたが考慮されるゲームに勝つと思います。
与えられたN≥1、少なくとも、あなたはあなたがこのゲームに勝つことができるようにする方法くらいの現金を計算する必要があります。
アイデア:動的計画範囲。
トピックを理解:あなたのnを与え、彼は実際の数字を有していてもよい(すなわちI番号を選択します)である任意の1-N 1(iで示される)、各iについて、回答支出がされている、多くの推測法があります最小限。私たちは、その後、答えは全てのiに対応する最小コストの最大値で、各iについて最小コストを持っています。

class Solution {
public:
    int getMoneyAmount(int n) {
        vector<vector<int>> dp(n+2, vector<int>(n+2, 100000000));
        for(int i = 1; i <= n; i++) {
            for(int j = 0; j <= i; j++){
                dp[i][j] = 0;
            }
        }
        for(int len = 2; len <= n; len++) {
            for(int L = 1; L + len - 1 <= n; L++) {
                int R = L + len - 1;
                for(int mid = L; mid <= R; mid++) 
                    dp[L][R] = min(dp[L][R], max(dp[L][mid - 1], dp[mid + 1][R]) + mid); 
            }
        }
        return dp[1][n];
    }
};
公開された15元の記事 ウォンの賞賛0 ビュー102

おすすめ

転載: blog.csdn.net/qq_41807225/article/details/104114244