下定决心,好好过一天 ~
题目传送
思路:在本子写写就知道。
2只能拆成 1 * 1,
3 为 1 * 2
可以看到,这俩个数拆了过后,他的乘积形式都比自身还小。那么就没必要
4 为 2 * 2
5 为 2 * 3
6 为 3 * 3
7 为 3 * 2 * 2
8 为 3 * 3 * 3
9 为 3 * 3 * 2 * 2
10 为 3 * 3 * 3 * 2
那么规律就出来了,第n个数的前一个数,如果有2的存在,那么直接把这个2变成3(n比n-1多1)
如果没有2,那么就得拆成俩个2出来,原因是,只有2和3拆了过后对其价值有所降低,而其他数拆了过后,其值都有增加。所有尽力拆成2和3的乘积形式。
那么我们保留第n-1个数的状态,保留状态为有多少个2. 然后根据上面递推第n个数的状态即可。
当然,大可不必用dp,只是我练手而已。
class Solution {
public:
int integerBreak(int n) {
int dp[1000] = {0};
int sum[1000] = {0};
dp[0] = 0;sum[0] = 0;
dp[1] = 0;sum[1] = 0;
dp[2] = 0;sum[2] = 1;
dp[3] = 1;sum[3] = 2;
dp[4] = 2;sum[4] = 4; //边界状态
for(int i = 5;i <= n;i++)
{
if(dp[i-1] != 0)
{
dp[i] = dp[i-1]-1;
int a = dp[i-1]-1;
int b = (i - a*2)/3;
sum[i] = (int)(pow(2,a))*(int)(pow(3,b));
}
else
{
dp[i] = 2;
int a = 2;
int b = (i - a*2)/3;
sum[i] = (int)(pow(2,a))*(int)(pow(3,b));
}
}
return sum[n];
}
};