剪绳子
剪绳子
http://www.nowcoder.com/questionTerminal/57d85990ba5b440ab888fc72b0751bf8
题目描述
给你一根长度为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]; } };