최대 합계 문제 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)
        );
    }
}

좋은 웹페이지 즐겨찾기