Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

เดาหมายเลขสูงกว่าหรือต่ำกว่า II ใน C ++


สมมติว่าเรากำลังเล่นเกมเดา กฎของเกมมีดังนี้ -

  • ผู้เล่น1 เลือกตัวเลขตั้งแต่ 1 ถึง n ผู้เล่น2 ต้องเดาว่าผู้เล่นเลือกหมายเลขใด1.
  • ทุกครั้งที่ผู้เล่น 2 เดาผิด ผู้เล่น 1 จะบอกว่าหมายเลขที่เลือกสูงหรือต่ำ

อย่างไรก็ตาม เมื่อผู้เล่นเดาหมายเลข x โดยเฉพาะ และผู้เล่นคนอื่นเดาผิด ผู้เล่นอีกคนต้องจ่าย $x เกมจะจบลงเมื่อผู้เล่น 2 ได้คำตอบที่ถูกต้อง

ตัวอย่างเช่น ถ้า n =10 และผู้เล่น 1 ได้ 8

  • รอบแรก ผู้เล่น 2 บอกเลข 5 ผิด เลขจริงสูงกว่า แล้วเขาจะให้ $5
  • รอบที่สอง ผู้เล่น 2 บอกเลขเป็น 7 ผิด เลขจริงสูงกว่า แล้วเขาจะให้ $7
  • รอบที่สาม ผู้เล่น 2 บอกเลขเป็น 9 ผิด เลขจริงต่ำกว่า แล้วเขาจะให้ $9

ตอนนี้เกมจบลง ดังนั้นเงินทั้งหมดที่ได้รับคือ $5 + $7 + $9 =$21

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • สร้างวิธีหนึ่งที่เรียกว่าต้นทุน ซึ่งกำลังต่ำ สูง อีกตารางหนึ่ง dp
  • ถ้าต่ำ>=สูง ให้คืนค่า 0
  • ถ้า dp[ต่ำ สูง] ไม่ใช่ -1 ให้คืนค่า dp[ต่ำ สูง]
  • ตอบ :=inf
  • สำหรับผมอยู่ในช่วงต่ำไปสูง
    • ans :=ขั้นต่ำของ ans และ (i + สูงสุดของต้นทุน (ต่ำ, i – 1, dp) และต้นทุน (i + 1, สูง, dp))
  • dp[low, high] :=ans และ return ans
  • วิธีการจริงจะเป็นเช่น −
  • สร้างอาร์เรย์ 2d หนึ่งรายการที่เรียกว่า dp ของขนาด (n + 1) x (n + 1) แล้วเติมด้วย -1
  • ผลตอบแทน (1, n, dp)

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int cost(int low, int high, vector < vector <int> >& dp){
      if(low >= high)return 0;
      if(dp[low][high] != -1)return dp[low][high];
      int ans = INT_MAX;
      for(int i = low; i <= high; i++){
         ans = min(ans, i + max(cost(low, i - 1, dp), cost(i + 1, high, dp)));
      }
      return dp[low][high] = ans;
   }
   int getMoneyAmount(int n) {
      vector < vector <int> > dp(n + 1, vector <int> (n + 1, -1));
      return cost(1, n, dp);
   }
};
int main() {
   Solution ob1;
   cout << ob1.getMoneyAmount(8) << endl;
   return 0;
}

อินพุต

8

ผลลัพธ์

12