题目:
这题的数学做法有点难以理解,毕竟如果把高数还回去了,是基本看不懂的。而且如果在面试里面遇到,也没有那个时间去计算证明。
还是动态规划好理解一点。并且很容易说清楚。
对于一个数字i,拆分出一个正整数j
那么最大乘积等于j乘(i-j)和j乘dp【i-j】的最大值。
前一项是对j不继续进行拆分得到的。而后一项是需要继续进行拆分得到的。
于是我们对每一个数字i都去枚举j即可
C++代码附带测试:
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
//动态规划法
int integerBreak(int n) {
if(n==0||n==1){
return 0;
}
int size = n+1;
vector<int> dp(size,0);
dp[0] = 0;
dp[1] = 0;
for(int i=2;i<=n;i++){
for(int j = 1;j<i;j++){
int x = max(j*(i-j),j*dp[i-j]);//不拆分和继续拆分的最大值
dp[i] = max(x,dp[i]);
}
}
return dp[n];
}
};
int main(){
Solution solution;
cout<<solution.integerBreak(10)<<endl;
}