题目描述

给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m]。请问k[0]xk[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

输入描述:

输入一个数n,意义见题面。(2 <= n <= 60)


【贪心】 只要想到状态转移方程,这题就解了, dp[i] = max ( dp[i-j]*(j), dp[i-j]*dp[j], (i-j)*dp[j], (i-j)*j)  (j=1,2...i-1)

class Solution {
public:
    int cutRope(int number) {
        int dp[number];
        memset(dp,0,sizeof(dp));
        dp[1]=1;
        dp[2]=1;
        dp[3]=2;
        dp[4]=4;
        for(int i=5;i<=number;i++)
        {
            for(int j=1;j<i;j++)
            {
                int temp=max(max(dp[i-j]*j,dp[i-j]*dp[j]),max((i-j)*dp[j],(i-j)*j));
                dp[i]=max( dp[i], temp );
            }
        }
        return dp[number];
    }
};