553. 最优除法(区间dp & 数学)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了553. 最优除法(区间dp & 数学)相关的知识,希望对你有一定的参考价值。

553. 最优除法(区间dp & 数学)

1.区间dp

显然可以用区间dp,维护区间最大值和最小值然再维护两个对应的字符串。

时间复杂度: O ( n 3 ) O(n^3) O(n3)

struct Node 
    double maxVal, minVal;
    string minStr, maxStr;
    Node() 
        this->minVal = 10000.0;
        this->maxVal = 0.0;
    
;

class Solution 
public:
    string optimalDivision(vector<int>& nums) 
        int n = nums.size();
        vector<vector<Node>> dp(n, vector<Node>(n));

        for (int i = 0; i < n; i++) 
            dp[i][i].minVal = nums[i];
            dp[i][i].maxVal = nums[i];
            dp[i][i].minStr = to_string(nums[i]);
            dp[i][i].maxStr = to_string(nums[i]);
        
        for (int i = 1; i < n; i++) 
            for (int j = 0; j + i < n; j++) 
                for (int k = j; k < j + i; k++) 
                    if (dp[j][j + i].maxVal < dp[j][k].maxVal / dp[k + 1][j + i].minVal) 
                        dp[j][j + i].maxVal = dp[j][k].maxVal / dp[k + 1][j + i].minVal;
                        if (k + 1 == j + i) 
                            dp[j][j + i].maxStr = dp[j][k].maxStr + "/" + dp[k + 1][j + i].minStr;
                         else 
                            dp[j][j + i].maxStr = dp[j][k].maxStr + "/(" + dp[k + 1][j + i].minStr + ")";
                        
                    
                    if (dp[j][j + i].minVal > dp[j][k].minVal / dp[k + 1][j + i].maxVal) 
                        dp[j][j + i].minVal = dp[j][k].minVal / dp[k + 1][j + i].maxVal;
                        if (k + 1 == j + i) 
                            dp[j][j + i].minStr = dp[j][k].minStr + "/" + dp[k + 1][j + i].maxStr; 
                         else 
                            dp[j][j + i].minStr = dp[j][k].minStr + "/(" + dp[k + 1][j + i].maxStr + ")"; 
                        
                    
                
            
        
        return dp[0][n - 1].maxStr;
    
;

2.数学

因为 n u m > 1 num>1 num>1,显然分子最大是 n u m 0 num_0 num0

要求分母最小,显然全部除即可。

所以是 n u m 0 n u m 1 ÷ n u m 1 ⋯ ÷ n u m n − 1 \\dfracnum_0num_1\\div num1\\dots\\div num_n-1 num1÷num1÷numn1num0

时间复杂度: O ( n ) O(n) O(n)

class Solution 
public:
    string optimalDivision(vector<int>& nums) 
        int n = nums.size();        
        if (n == 1) 
            return to_string(nums[0]);
        
        if (n == 2) 
            return to_string(nums[0]) + "/" + to_string(nums[1]);
        
        string res = to_string(nums[0]) + "/(" + to_string(nums[1]);
        for (int i = 2; i < n; i++) 
            res.append("/" + to_string(nums[i]));
        
        res.append(")");
        return res;
    
;

以上是关于553. 最优除法(区间dp & 数学)的主要内容,如果未能解决你的问题,请参考以下文章

字符串553. 最优除法

力扣553(java)-最优除法(中等)

Leetcode 553.最优除法

ZOJ 3537 Cake (凸包 + 区间DP && 最优三角形剖分)

LeetCode 2016. 增量元素之间的最大差值 / 553. 最优除法 / 1601. 最多可达成的换楼请求数目(枚举+回溯)

leetcode刷题总结551-600