কম্পিউটার

C++ এ k দিনের মধ্যে কাজ সম্পূর্ণ করতে ন্যূনতম অসুবিধার যোগফল খুঁজে বের করার প্রোগ্রাম


ধরুন আমাদের কাছে চাকরি নামক সংখ্যার একটি তালিকা আছে এবং আরেকটি মান k আছে। এখন আমরা k বিভিন্ন দিনে সব কাজ শেষ করতে চাই। কাজগুলি অবশ্যই প্রদত্ত ক্রমে সম্পাদন করতে হবে এবং প্রতিটি দিনে আমাদের একটি কাজ সম্পূর্ণ করতে হবে। কাজের অসুবিধা i চাকরিতে সংরক্ষিত থাকে [i] এবং একটি দিনে চাকরির তালিকা সম্পূর্ণ করতে অসুবিধা হবে সেই দিনে সম্পাদিত সর্বাধিক অসুবিধার কাজ। তাই k বিভিন্ন দিনে কাজগুলি সম্পাদন করতে আমাদের ন্যূনতম সমষ্টি খুঁজে বের করতে হবে।

সুতরাং, যদি ইনপুটটি jobs =[2, 3, 4, 6, 3] k =2 এর মত হয়, তাহলে আউটপুট হবে 8, প্রথমে আমরা [2] করি তারপর [3, 4, 6, 3] করি। তাই অসুবিধা হল 2 + ​​সর্বাধিক (3, 4, 6, 3) =8।

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • আকারের একটি অ্যারে ডিপি সংজ্ঞায়িত করুন:505 x 15।
  • একটি ফাংশন dfs() সংজ্ঞায়িত করুন, এটি স্টার্ট, কে, এবং একটি অ্যারে v,
  • যদি শুরু>=v এর আকার হয়, তাহলে −
    • রিটার্ন (যদি k 0 এর মত হয়, তাহলে 0, অন্যথায় inf)
  • যদি k <0 হয়, তাহলে −
    • রিটার্ন ইনফ
  • যদি dp[start, k] -1 এর সমান না হয়, তাহলে −
    • রিটার্ন dp[start, k]
  • ret :=inf
  • val :=0
  • আরম্ভ করার জন্য i :=শুরু করুন, যখন i
  • val :=সর্বোচ্চ val এবং v[i]
  • ret :=ret এর সর্বনিম্ন এবং (val + dfs(i + 1, k - 1, v))
  • dp[start, k] =ret
  • রিটার্ন রিটার্ন
  • প্রধান পদ্ধতি থেকে নিম্নলিখিতগুলি করুন -
  • -1 দিয়ে dp পূরণ করুন
  • dfs(0, k, jobs) ফেরত দিন
  • উদাহরণ (C++)

    আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -

    #include <bits/stdc++.h>
    using namespace std;
    const int inf = 1e6;
    int dp[505][15];
    int dfs(int start, int k, vector <int>& v){
       if(start >= v.size()){
          return k == 0 ? 0 : inf;
       }
       if(k < 0)
          return inf;
       if(dp[start][k] != -1)
          return dp[start][k];
       int ret = inf;
       int val = 0;
       for(int i = start; i < v.size(); i++){
          val = max(val, v[i]);
          ret = min(ret, val + dfs(i + 1, k - 1, v));
       }
       return dp[start][k] = ret;
    }
    int solve(vector<int>& jobs, int k) {
       memset(dp ,-1, sizeof dp);
       return dfs(0, k, jobs);
    }
    int main(){
       vector<int> v = {2, 3, 4, 6, 3};
       int k = 2;
       cout << solve(v, k);
    }

    ইনপুট

    {2, 3, 4, 6, 3}, 2

    আউটপুট

    8

    1. C++ এ গভীরতম নোডের যোগফল খুঁজে বের করার জন্য প্রোগ্রাম

    2. C++ এ ন্যূনতম যোগফল আছে এমন ট্রি লেভেল খুঁজে বের করার প্রোগ্রাম

    3. যেকোন বীজগাণিতিক রাশির ন্যূনতম মান খুঁজে পেতে C++ প্রোগ্রাম

    4. Recursion ব্যবহার করে প্রাকৃতিক সংখ্যার যোগফল খুঁজে পেতে C++ প্রোগ্রাম