የ n ቁጥሮች ማባዣዎች አነስተኛ ድምር  


የችግር ደረጃ ጠንካራ
ውስጥ በተደጋጋሚ ተጠየቀ Accenture ብላክ ሮክ GE የጤና ጂፒ ሞርጋን የ PayPal
ሰልፍ ተለዋዋጭ ፕሮግራም

ችግሩ “የ n ቁጥሮች ማባዣዎች አነስተኛ ድምር” n እንደተሰጠዎት ይናገራል ኢንቲጀሮች እና በአንድ ጊዜ የሚዛመዱ ሁለት አባላትን በመውሰድ እና አንድ ቁጥር እስኪቀር ድረስ ድምር ሞዶቻቸውን 100 በመመለስ የሁሉም ቁጥሮች ማባዣ ድምርን መቀነስ ያስፈልግዎታል።

ለምሳሌ  

የ n ቁጥሮች ማባዣዎች አነስተኛ ድምርጭንቅላታም መያያዣ መርፌ

10 20 30
1100

ማስረጃ

በመጀመሪያ ፣ 10 ለማግኘት 20 እና 200 ተባዝተን መልሰን (10 + 20)% 100 = 30. አሁን [30 ፣ 30] አለን ፡፡ ከዚያ 30 * 30 = 900 ያባዙ። ስለሆነም መልሱ 900 + 200 = 1100 ነው።

መጀመሪያ 20 እና 30 ብባዛ ኖሮ (20 * 30) + (10 * 50) = 1100 አግኝተናል ነበር ስለሆነም በሁለቱም መንገዶች አንድ ውጤት እናገኝ ነበር ፡፡

ቀረበ  

ቁጥሮቹን በጥንድ ማባዛትዎን ይቀጥሉ እና ከዚያ ተጨማሪቸውን የሚያደርጉትን ሊገኝ የሚችል አነስተኛውን ድምር እንድናገኝ ችግሩ ይጠይቀናል። ችግሩን ለመፍታት የዋህነት አቀራረብ እየተጠቀመ ነው ተደጋጋሚነት. ሁሉንም ጥፋቶች ይፍጠሩ እና ከዚያ እነዚህ ጥፋቶች በጥንድ ሊባዙ የሚገባቸውን ጠቋሚዎችን እንደሚያመለክቱ ያስቡ ፡፡ ነገር ግን ይህ አካሄድ ጊዜ የሚወስድ ነው ምክንያቱም የፔሚሜሽን ማመንጨት ተጨባጭ ሁኔታ ውስብስብነት አለው ፡፡

ከዚህ ጊዜ-ሰጭ አካሄድ ይልቅ ውጤቱን በጊዜው ገደብ ማስላት የሚችል ሌላ ማንኛውንም መፍትሄ ማሰብ አለብን ፡፡ አሁን ተለዋዋጭ ፕሮግራም ወደ እኛ ይመጣል ፡፡ ችግሩ በመደበኛው የማትሪክ ቼይን ማባዛት ችግር ላይ ትንሽ ልዩነት ነው። እዚህ በዚህ ችግር በመጀመሪያ መልሱን ለ 2 አካላት ፣ ከዚያ ለ 3 አካላት እና ወዘተ እንሰላለን ፡፡ ስለዚህ ማውጫዎቹን ቅደም ተከተሉን ወሰን በሚያመለክተው በድጋሜ ተግባር ውስጥ ለማከማቸት ሁለት ተለዋዋጮችን እንጠብቃለን ፡፡ ከዚያ በኋላ ቅደም ተከተሉን በ 2 ክፍሎች ከፍለናል ፡፡ እና ከዚያ እነዚህን ሁለት ንዑስ ችግሮች ይፍቱ ፡፡ መሰረታዊውን ጉዳይ እስክንመታ ድረስ ይህ ሂደት ይቀጥላል ፡፡ እዚህ መሰረታዊው ጉዳይ ሁለቱም ማውጫዎች ተመሳሳይ ሲሆኑ ነው ፡፡ ከዚያ ለእነዚህ ንዑስ ፕሮፌሰሮች መልሱን እንደሰላነው ለመነሻ ችግር ውጤቱን ለማግኘት መልሶችን እናጣምራለን ፡፡

ተመልከት
ፕሮግራም ለድልድይ እና ችቦ ችግር

ኮድ  

የ n ቁጥሮች አነስተኛ ድምርን ለማግኘት የ C ++ ኮድ

#include <bits/stdc++.h>
using namespace std;
int dp[5][5];
int sum(int i, int j, int a[]){
  int ans = 0;
  for (int k=i;k<=j;k++)
    ans=(ans+a[k])%100;
  return ans;
}

int minimumSum(int i, int j, int a[]){
    if(i==j)return 0;
  if (dp[i][j] != INT_MAX)
    return dp[i][j];
    // divide the problem into subproblems
  for(int k=i;k<j;k++)
        dp[i][j] = min(dp[i][j], minimumSum(i,k,a)+minimumSum(k+1,j,a) + sum(i,k,a)*sum(k+1,j,a));
  return dp[i][j];
}

int main() {
  int a[] = {10, 20, 30};
  int n = sizeof(a) / sizeof(a[0]);
  for(int i=0;i<5;i++){
        for(int j=0;j<5;j++)
            dp[i][j] = INT_MAX;
  }
  cout<<minimumSum(0,n-1,a);
}
1100

የ n ቁጥሮች አነስተኛ ብዜቶች ድምርን ለማግኘት የጃቫ ኮድ

import java.util.*;
class Main{
  static int dp[][] = new int[5][5];
  static int sum(int i, int j, int a[]){
    int ans = 0;
    for (int k=i;k<=j;k++)
      ans=(ans+a[k])%100;
    return ans;
  }

  static int minimumSum(int i, int j, int a[]){
      if(i==j)return 0;
    if (dp[i][j] != Integer.MAX_VALUE)
      return dp[i][j];
      // divide the problem into subproblems
    for(int k=i;k<j;k++)
          dp[i][j] = Math.min(dp[i][j], minimumSum(i,k,a)+minimumSum(k+1,j,a) + sum(i,k,a)*sum(k+1,j,a));
    return dp[i][j];
  }

  public static void main(String[] args)
  {
    int a[] = {10, 20, 30};
    int n = a.length;
    for(int i=0;i<5;i++){
          for(int j=0;j<5;j++)
              dp[i][j] = Integer.MAX_VALUE;
    }
    int ans = minimumSum(0,n-1,a);
    	System.out.print(ans);
  	}
}
1100

ውስብስብነት ትንተና  

የጊዜ ውስብስብነት

ኦ (N ^ 3) ፣ ምክንያቱም N ^ 2 ግዛቶች አሉ እና ለእያንዳንዱ ውጤቱን ለማስላት በግምታዊ የ N ቁጥር ግዛቶች ላይ ጥገኛ ነን። ስለዚህ የጊዜ ውስብስብነት ፖሊኖሚያል ነው።

የቦታ ውስብስብነት

ኦ (N ^ 2) ፣ ምክንያቱም የ 2 ዲ ዲፒ ሰንጠረዥን ፈጥረናል ፡፡ ስለዚህ የቦታ ውስብስብነት እንዲሁ ፖሊኖሚያል ነው።