मान लीजिए कि रीमा निम्नलिखित खेल खेलती है, जो कि ताश के खेल "21" पर आधारित है। अतः रीमा 0 अंक से प्रारंभ करती है, और संख्याएँ खींचती है जबकि उसके पास K से कम अंक हैं। अब, प्रत्येक ड्रा के दौरान, वह श्रेणी [1, W] से यादृच्छिक रूप से अंकों की एक पूर्णांक संख्या प्राप्त करती है, जहां W दिया गया है, और वह एक पूर्णांक है। अब प्रत्येक ड्रा स्वतंत्र है और परिणामों की समान संभावनाएं हैं। K या अधिक अंक प्राप्त करने पर रीमा संख्याएँ खींचना बंद कर देती है। हमें प्रायिकता ज्ञात करनी होगी कि उसके पास N या उससे कम अंक हैं?
तो अगर N =6, K 1 है और W 10 है, तो उत्तर 0.6 होगा, क्योंकि रीमा को एक ही कार्ड मिलता है, फिर रुक जाती है, 10 में से 6 संभावनाओं में, वह N =6 अंक पर या उससे नीचे है।पी>
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- अगर k 0 है, या N>=K + W, तो 1 लौटाएं
- एन + 1 आकार की एक सरणी डीपी बनाएं, डीपी सेट करें [0]:=1
- wsum सेट करें:=1.0, रेट करें:=0.0
- i के लिए 1 से N की सीमा में
- dp[i] :=wsum / W
- अगर मैं <के, तो wsum :=wsum + dp[i], अन्यथा ret :=ret + dp[i]
- यदि i - W>=0, तो wsum :=wsum - dp[i - W]
- रिटर्न रिटर्न
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
double new21Game(int N, int K, int W) {
if(K == 0 || N >= K + W) return 1.0;
vector <double> dp (N + 1);
dp[0] = 1;
double Wsum = 1.0;
double ret = 0.0;
for(int i = 1; i <= N; i++){
dp[i] = Wsum / W;
if(i < K){
Wsum += dp[i];
}else ret += dp[i];
if(i - W >= 0) Wsum -= dp[i - W];
}
return ret;
}
};
main(){
Solution ob;
cout << (ob.new21Game(6, 1, 10));
} इनपुट
6 1 10
आउटपुट
0.6