최대 합계 문제 GeeksForGeeks
4864 단어 javadpalgorithms
숫자 n은 세 부분 n/2, n/3 및 n/4로 나눌 수 있습니다(정수 부분만 고려). 이 과정에서 얻은 각 숫자는 재귀적으로 더 나눌 수 있습니다. 분할된 부분을 함께 합산하여 얻을 수 있는 최대 합계를 찾으십시오.
참고: 주어진 숫자는 적어도 한 번 나누어야 합니다.
예 1
Input:
n = 12
Output: 13
Explanation: Break n = 12 in three parts
{12/2, 12/3, 12/4} = {6, 4, 3}, now current
sum is = (6 + 4 + 3) = 13. Further breaking 6,
4 and 3 into parts will produce sum less than
or equal to 6, 4 and 3 respectively.
해결책
//User function Template for Java
//recursive solution tc : o(3^n) as we are calling recursive function 3 times /2,/3 and /4
//space time complexity is : o(3^n) auxillary space for the stack as their will be
// 3^n stack space that will be required
/*
class Solution
{
public int maxSum(int n)
{
return solve(n);
}
public int solve(int n){
if(n==1 || n==0) return n;
int a = n/2;
int b = n/3;
int c = n/4;
return Integer.max(n,
solve(a)+solve(b)+solve(c)
);
}
} */
// optimized solution using dynamic programming memoization top down approach
// time complexity is O(n) as at max there will be n states and dp will traverse those states
// space complexity will be O(n) for dp and o(n) for stack space;
class Solution
{
public int maxSum(int n)
{
int dp[] = new int[1000001];
Arrays.fill(dp,-1);
return solve(n,dp);
}
public int solve(int n,int dp[]){
if(n==1 || n==0) return n;
if(dp[n]!=-1) return dp[n];
int a = n/2;
int b = n/3;
int c = n/4;
return dp[n]= Integer.max(n,
solve(a,dp)+solve(b,dp)+solve(c,dp)
);
}
}
Reference
이 문제에 관하여(최대 합계 문제 GeeksForGeeks), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/prashantrmishra/maximum-sum-problem-geeksforgeeks-55ma텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)