Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में मैट्रिक्स में शीर्ष-बाएं से नीचे-दाएं जाकर वापस आने पर अधिकतम अंक


मैट्रिक्स दी गई है जिसमें '#' अवरुद्ध पथ, '*' अंक, '.' अनुमत पथ है। शीर्ष-बाएं से नीचे-दाएं जाएं (दाएं/नीचे चाल) और वापस आएं (बाएं/ऊपर चाल) ताकि अधिकतम अंक एकत्र हों।

दो पथ एक साथ सोचें: दोनों (0,0) से (n-1,m-1) तक जाते हैं। DP स्थिति: dp[row1][col1][row2]।

उदाहरण 5x5 मैट्रिक्स के लिए अधिकतम अंक 8।

C++ कार्यान्वयन

#include <bits/stdc++.h>
#define MAX 5
#define N 5
#define M 5
#define inf 100000
using namespace std;

int cost(char grid[][M], int row1, int col1, int row2, int col2) {
    if (row1 == row2 && col1 == col2) {
        if (grid[row1][col1] == '*') return 1;
        return 0;
    }
    int ans = 0;
    if (grid[row1][col1] == '*') ans++;
    if (grid[row2][col2] == '*') ans++;
    return ans;
}

int solve(int n, int m, char grid[][M], int dp[MAX][MAX][MAX], int row1, int col1, int row2) {
    int col2 = (row1 + col1) - row2;
    if (row1 == n-1 && col1 == m-1 && row2 == n-1 && col2 == m-1) return 0;
    if (row1 >= n || col1 >= m || row2 >= n || col2 >= m) return -inf;
    if (dp[row1][col1][row2] != -1) return dp[row1][col1][row2];
    int ch1 = -inf, ch2 = -inf, ch3 = -inf, ch4 = -inf;
    if (grid[row1][col1+1] != '#' && grid[row2+1][col2] != '#')
        ch1 = cost(grid, row1, col1+1, row2+1, col2) + solve(n, m, grid, dp, row1, col1+1, row2+1);
    if (grid[row1][col1+1] != '#' && grid[row2][col2+1] != '#')
        ch2 = cost(grid, row1, col1+1, row2, col2+1) + solve(n, m, grid, dp, row1, col1+1, row2);
    if (grid[row1+1][col1] != '#' && grid[row2][col2+1] != '#')
        ch3 = cost(grid, row1+1, col1, row2, col2+1) + solve(n, m, grid, dp, row1+1, col1, row2);
    if (grid[row1+1][col1] != '#' && grid[row2+1][col2] != '#')
        ch4 = cost(grid, row1+1, col1, row2+1, col2) + solve(n, m, grid, dp, row1+1, col1, row2+1);
    return dp[row1][col1][row2] = max({ch1, ch2, ch3, ch4});
}

int wrapper(int n, int m, char grid[N][M]) {
    int ans = 0;
    int dp[MAX][MAX][MAX];
    memset(dp, -1, sizeof dp);
    if (grid[n-1][m-1] == '#' || grid[0][0] == '#') ans = -inf;
    if (grid[0][0] == '*') ans++;
    grid[0][0] = '.';
    if (grid[n-1][m-1] == '*') ans++;
    grid[n-1][m-1] = '.';
    ans += solve(n, m, grid, dp, 0, 0, 0);
    return max(ans, 0);
}

int main() {
    int n = 5, m = 5;
    char grid[N][M] = {
        {'.', '*', '.', '*', '.'},
        {'*', '#', '#', '#', '.'},
        {'*', '.', '*', '.', '*'},
        {'.', '#', '#', '#', '*'},
        {'.', '*', '.', '*', '.'}
    };
    cout << wrapper(n, m, grid) << endl;
    return 0;
}

आउटपुट

8
  1. - C++ में बाएं और दाएं अगले बड़े तत्व के इंडेक्स गुणनफल का अधिकतम मान

    सरणी दी गई है। प्रत्येक तत्व के लिए बाएं तरफ निकटतम बड़ा तत्व का इंडेक्स L(i) और दाएं तरफ निकटतम बड़ा तत्व का इंडेक्स R(i) खोजें। L(i) * R(i) का अधिकतम मान ज्ञात करें। स्टैक का उपयोग करके दोनों तरफ के अगले बड़े तत्व O(n) में खोजें। उदाहरण: {5, 4, 3, 4, 5} → अधिकतम गुणनफल 8। C++ कार्यान्वयन #include

  1. - C++ में मैट्रिक्स में शीर्ष-बाएं से नीचे-दाएं जाकर वापस आने पर अधिकतम अंक

    मैट्रिक्स दी गई है जिसमें # अवरुद्ध पथ, * अंक, . अनुमत पथ है। शीर्ष-बाएं से नीचे-दाएं जाएं (दाएं/नीचे चाल) और वापस आएं (बाएं/ऊपर चाल) ताकि अधिकतम अंक एकत्र हों। दो पथ एक साथ सोचें: दोनों (0,0) से (n-1,m-1) तक जाते हैं। DP स्थिति: dp[row1][col1][row2]। उदाहरण 5x5 मैट्रिक्स के लिए अधिकतम अंक 8। C++ क

  1. C++ में अधिकतम दर्पण जो प्रकाश को नीचे से दाएं स्थानांतरित कर सकते हैं C++ में अधिकतम दर्पण जो प्रकाश को नीचे से दाएं स्थानांतरित कर सकते हैं

    हमें एक वर्ग मैट्रिक्स दिया गया है जिसमें केवल 0 और 1 हैं। 0 खाली स्थान दर्शाता है और 1 बाधा दर्शाता है। हमें खाली सेल पर रखे जा सकने वाले दर्पणों की संख्या ढूंढनी होगी ताकि ये दर्पण प्रकाश को नीचे से दाएं स्थानांतरित कर सकें। यह तब संभव है जब, दर्पण इंडेक्स [i,j] पर रखा गया हो और उस विशेष पंक्ति (i