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

C++ में पालिंड्रोमिक सबलिस्ट्स को हटाने के लिए आवश्यक ऑपरेशन्स की संख्या गिनने का प्रोग्राम

समस्या विवरण

मान लीजिए हमारे पास nums नामक संख्याओं की एक सूची है। अब एक ऑपरेशन पर विचार करें जहां हम कुछ सबलिस्ट को हटाते हैं जो एक पालिंड्रोम है। हमें न्यूनतम ऑपरेशन्स की संख्या ढूंढनी है ताकि सूची खाली हो जाए।

उदाहरण के लिए, यदि इनपुट है nums = [6, 2, 4, 4, 2, 10, 6], तो आउटपुट 2 होगा, क्योंकि हम पहले सबलिस्ट [2, 4, 4, 2] को हटा सकते हैं फिर सूची [6, 10, 6] जैसी हो जाती है यह भी एक पालिंड्रोम है, इसलिए इसे हटाकर सूची खाली करें।

हल करने का दृष्टिकोण

इस समस्या को हल करने के लिए हम निम्नलिखित चरणों का पालन करेंगे:

  1. आकार 105×105 का एक DP ऐरे परिभाषित करें
  2. एक फंक्शन dfs() परिभाषित करें जो i, j, और ऐरे v लेता है
  3. ret := अनंत
  4. यदि i > j, तो 0 वापस करें
  5. यदि i == j, तो 1 वापस करें
  6. यदि j - i == 1, तो (यदि v[i] == v[j] तो 1 अन्यथा 2) वापस करें
  7. यदि i+1 ≤ j और v[i] == v[i+1], तो ret := 1 + dfs(i+2, j, v)
  8. यदि dp[i][j] != -1, तो dp[i][j] वापस करें
  9. ret := min(ret, 1 + min(dfs(i+1, j, v), dfs(i, j-1, v)))
  10. यदि v[i] == v[j], तो ret := min(ret, dfs(i+1, j-1, v))
  11. k := i+2 से j-1 तक:
    • यदि v[i] == v[k], तो ret := min(ret, dfs(i+1, k-1, v) + dfs(k+1, j, v))
  12. dp[i][j] = ret वापस करें
  13. मुख्य विधि से:
    • dp को -1 से भरें
    • n := nums का आकार
    • dfs(0, n-1, nums) वापस करें

उदाहरण

#include <bits/stdc++.h>
using namespace std;

int dp[105][105];

int dfs(int i, int j, vector<int>& v) {
    int ret = INT_MAX;
    if (i > j) return 0;
    if (i == j) return 1;
    if (j - i == 1) {
        return v[i] == v[j] ? 1 : 2;
    }
    if (i + 1 <= j && v[i] == v[i + 1]) {
        ret = 1 + dfs(i + 2, j, v);
    }
    if (dp[i][j] != -1) return dp[i][j];
    ret = min({ret, 1 + min(dfs(i + 1, j, v), dfs(i, j - 1, v))});
    if (v[i] == v[j]) {
        ret = min(ret, dfs(i + 1, j - 1, v));
    }
    for (int k = i + 2; k < j; k++) {
        if (v[i] == v[k]) {
            ret = min(ret, dfs(i + 1, k - 1, v) + dfs(k + 1, j, v));
        }
    }
    return dp[i][j] = ret;
}

int solve(vector<int>& nums) {
    memset(dp, -1, sizeof dp);
    int n = nums.size();
    return dfs(0, n - 1, nums);
}

int main() {
    vector<int> v = {6, 2, 4, 4, 2, 10, 6};
    cout << solve(v);
}

इनपुट

{6, 2, 4, 4, 2, 10, 6}

आउटपुट

2
  1. - C++ में Nवीं सम फाइबोनैचि संख्या खोजने का प्रोग्राम

    समस्या विवरण इस समस्या में, हमें एक पूर्णांक मान N दिया गया है। हमारा कार्य Nवीं सम फाइबोनैचि संख्या खोजना है। फाइबोनैचि श्रृंखला पिछली दो संख्याओं को जोड़कर बाद की संख्या उत्पन्न करती है। फाइबोनैचि श्रृंखला दो संख्याओं से शुरू होती है - F0 और F1। F0 और F1 के प्रारंभिक मान 0, 1 या 1, 1 लिए जा सकते

  1. - C++ प्रोग्राम श्रृंखला 1, 6, 15, 28, 45, ….. का Nवां नंबर ढूंढने के लिए

    इस समस्या में, हमें एक पूर्णांक मान N दिया जाता है। हमारा कार्य श्रृंखला 1, 6, 15, 28, 45, … का Nवां नंबर ढूंढने के लिए एक प्रोग्राम बनाना है।श्रृंखला में, प्रत्येक तत्व पिछले और अगले तत्व के माध्य से 2 कम होता है।आइए एक उदाहरण से समस्या को समझते हैं,इनपुटN = 5आउटपुट45समाधान दृष्टिकोणश्रृंखला 1, 6,

  1. C++ में प्रतिद्वंद्वी को पकड़ने के लिए आवश्यक न्यूनतम चरणों की संख्या ढूंढने का प्रोग्राम C++ में प्रतिद्वंद्वी को पकड़ने के लिए आवश्यक न्यूनतम चरणों की संख्या ढूंढने का प्रोग्राम

    परिचय मान लीजिए हमारे पास ट्री एजेज की एक सूची है [u, v] के रूप में, जो इंगित करती है कि u और v के बीच एक अनडायरेक्टेड एज है। और हमारे पास दो मान x और y भी हैं। यदि हम नोड x पर हैं, और हमारा प्रतिद्वंद्वी नोड y पर है। पहले राउंड में हम चलते हैं, फिर अगले राउंड में प्रतिद्वंद्वी चलता है और इसी तरह।