leetcode 343 整数拆分

1.这个题拿到之后没有什么思路,此时就应该考虑暴力法。然而每次不知道要拆成几份,没办法用循环,所以想到用递归。

如图所示进行递归,显然有很多重复的计算,所以用自底向上的动态规划。

2.还有一个问题就是memo[i]是如果拆开i的话的最大值,有些数字比如5=2+3,2*3=6>5,这种数字memo[i]>i,拆开更好,但有的数拆开要比原来的数小,所以要进行判断,选择最大的数字

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
    int integerBreak(int n) {
        vector<int>memo(n+1, 0);
        memo[1] = 1;
        memo[2]=1;
        int i, j;
        int max;
        for (i = 3; i <= n; i++)
        {
            max=0;
            for (j = 1; j <=(i-1); j++)
            {
                if((memo[j]>(j)?memo[j]:j)*(memo[i-j]>(i-j)?memo[i-j]:i-j)>max)
                    max=(memo[j]>(j)?memo[j]:j)*(memo[i-j]>(i-j)?memo[i-j]:i-j);
            }
            memo[i]=max;
        }
        return memo[n];
    }
};

猜你喜欢

转载自www.cnblogs.com/legendcong/p/9141977.html