কম্পিউটার টিউটোরিয়াল

C++-এ নির্দিষ্ট স্টেপে একই জায়গায় থাকার পথ সংখ্যা (Number of Ways to Stay in Same Place)


ধরি arrLen আকারের একটি অ্যারে এবং ইন্ডেক্স 0-এ একটি পয়েন্টার আছে। প্রতিটি স্টেপে বামে, ডানে বা একই জায়গায় থাকা যায়। steps এবং arrLen দেওয়া থাকলে steps স্টেপ পর পয়েন্টার ইন্ডেক্স 0-এ থাকার পথ সংখ্যা বের করতে হবে (মডুলো 10^9+7)।

steps=3, arrLen=2 হলে আউটপুট 4।

সমাধানের ধাপসমূহ

  • MOD := 1e9+7, add() ফাংশন মডুলো যোগ করার জন্য

  • DP টেবিল: dp[2][x+1] যেখানে x = min(arrLen, steps/2+1)

  • dp[0][0] = 1

  • i := 1 থেকে steps পর্যন্ত – j := 0 থেকে min(arrLen, steps/2+1) পর্যন্ত DP ট্রানজিশন করুন

  • dp[steps%2][0] ফেরত দিন

বेहतर বোঝার জন্য নিচের কোডটি দেখুন –

উদাহরণ

#include <bits/stdc++.h> using namespace std; typedef long long int lli; const int MOD = 1e9 + 7; lli add(lli a, lli b){    return (a % MOD + b % MOD) % MOD; } class Solution {    public:    vector<vector<int> > dp;    int solve(int n, int x, int pos = 0){       if (x == 0) {          return pos == 0;       }       if (dp[pos][n] != -1)       return dp[pos][n];       int ans = 0;       if (pos > 0)       ans = add(ans, solve(n, x - 1, pos - 1));       if (pos < n - 1)       ans = add(ans, solve(n, x - 1, pos + 1));       ans = add(ans, solve(n, x - 1, pos));       dp[pos][n] = ans;       return ans;    }    int numWays(int steps, int arrLen){       int x = min(arrLen, steps / 2 + 1);       this->dp = vector<vector<int> >(2, vector<int>(x + 1, 0));       dp[0][0] = 1;       int n = arrLen;       for (int i = 1; i <= steps; i++) {          for (int j = 0; j < min(arrLen, steps / 2 + 1); j++) {             int x = (i - 1) % 2;             int y = i % 2;             dp[y][j] = dp[x][j];             if (j - 1 >= 0)             dp[y][j] = add(dp[y][j], dp[x][j - 1]);             if (j + 1 < n)             dp[y][j] = add(dp[y][j], dp[x][j + 1]);          }       }       return dp[steps % 2][0];    } }; main(){    Solution ob;    cout << (ob.numWays(3,2)); }

ইনপুট

3, 2

আউটপুট

4

  1. C++ দিয়ে N-ary ট্রি ট্রাভার্স করার উপায়ের সংখ্যা বের করা

  2. C++-এ 1 x m আকারের টাইল দিয়ে n x m আকারের ফ্লোর টাইল করার পদ্ধতির সংখ্যা গণনা

  3. C++-এ সংখ্যার প্যারিটি (Parity) দক্ষতার সাথে বের করা

  4. C++-এ প্রতিপক্ষকে ধরতে ন্যূনতম রাউন্ড সংখ্যা বের করা