ধরুন আমাদের একটি অ্যারে রয়েছে (সূচী 1 থেকে শুরু হয়) N সংখ্যাগুলির সাথে:A1, A2, ..., AN এবং আরেকটি পূর্ণসংখ্যা B। পূর্ণসংখ্যা B নির্দেশ করে যে যেকোন সূচক থেকে আমি অ্যারেতে আছে, আমরা যে কোনোটিতে যেতে পারি। অ্যারের মধ্যে একটি স্থান সূচীকৃত i+1, i+2, …, i+B যদি এই স্থানে লাফ দেওয়া যায়। এছাড়াও, যদি আমরা সূচক i-এ পা রাখি, তাহলে আমাদের Ai পরিমাণ কয়েন দিতে হবে। Ai যদি -1 হয়, তাহলে এর মানে আমরা অ্যারেতে i সূচীকৃত স্থানে যেতে পারব না।
এখন, যখন আমরা অ্যারে এ সূচীকৃত 1 স্থান থেকে শুরু করি এবং আমাদের লক্ষ্য ন্যূনতম কয়েন ব্যবহার করে সূচীকৃত N স্থানে পৌঁছানো। ন্যূনতম কয়েন ব্যবহার করে সূচীকৃত N স্থানে পৌঁছানোর জন্য আমাদের অ্যারেতে ইনডেক্সের পাথ (1 থেকে N থেকে শুরু করে) ফেরত দিতে হবে। আমাদের যদি একই খরচে একাধিক পথ থাকে, তাহলে আমাদের অভিধানিকভাবে সবচেয়ে ছোট পথটি খুঁজে বের করতে হবে। এবং যদি আমাদের কাছে সূচীকৃত N-এ পৌঁছানোর মতো কোনও সম্ভাব্য পথ না থাকে তবে আমরা একটি খালি অ্যারে ফিরিয়ে দেব।
সুতরাং, ইনপুট যদি [1,2,4,-1,2], 2 এর মত হয়, তাহলে আউটপুট হবে [1,3,5]
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
n :=A
এর আকার -
একটি অ্যারে ret সংজ্ঞায়িত করুন
-
n আকারের একটি অ্যারের খরচ সংজ্ঞায়িত করুন এবং এটিকে inf দিয়ে পূরণ করুন
-
n আকারের পাশে একটি অ্যারে সংজ্ঞায়িত করুন এবং এটি -1
দিয়ে পূরণ করুন -
যদি n না হয় অ-শূন্য বা A[n - 1] -1 এর সমান, তাহলে −
-
endPoint :=n - 1
-
-
খরচ[n - 1] =A[n - 1]
-
আরম্ভ করার জন্য i :=n - 2, যখন i>=0, আপডেট করুন (i 1 দ্বারা কম করুন), −
-
যদি A[i] -1 এর মত হয়, তাহলে −
-
নিম্নলিখিত অংশ উপেক্ষা করুন, পরবর্তী পুনরাবৃত্তি এড়িয়ে যান
-
-
j এর জন্য i + 1 থেকে সর্বনিম্ন (n - 1) এবং i + B এর মধ্যে, j 1 দ্বারা বাড়ান −
-
যদি খরচ[j] + A[i] <খরচ[i] হয়, তাহলে −
-
খরচ[i] :=খরচ[j] + A[i]
-
পরবর্তী[i] :=j
-
endPoint :=i
-
-
-
-
যদি endPoint 0 এর সমান না হয়, তাহলে −
-
খালি অ্যারে ফেরত দিন
-
-
endPoint-এর জন্য -1 এর সমান নয়, endPoint =পরবর্তী[endPoint], করুন −
-
ret এর শেষে endPoint + 1 সন্নিবেশ করুন
-
-
রিটার্ন রিটার্ন
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
class Solution {
public:
vector<int> cheapestJump(vector<int>& A, int B) {
int n = A.size();
vector <int> ret;
vector <int> cost(n, 1e9);
vector <int> next(n, -1);
if(!n || A[n - 1] == -1) return {};
int endPoint = n - 1;
cost[n - 1] = A[n - 1];
for(int i = n - 2; i >= 0; i--){
if(A[i] == -1) continue;
for(int j = i + 1 ; j <= min(n - 1, i + B); j++){
if(cost[j] + A[i] < cost[i]){
cost[i] = cost[j] + A[i];
next[i] = j;
endPoint = i;
}
}
}
if(endPoint != 0) return {};
for(;endPoint != - 1; endPoint = next[endPoint]){
ret.push_back(endPoint + 1);
}
return ret;
}
};
main(){
Solution ob;
vector<int> v = {1,2,4,-1,2};
print_vector(ob.cheapestJump(v, 2));
} ইনপুট
{1,2,4,-1,2}, 2 আউটপুট
[1, 3, 5, ]