package jianzhioffer;
/**
* 割繩子1
* 一般想到的都是動態規劃 從長爲n的繩子中割出m段,m和n都大於1,
* 首先思考動態規劃遞推關係,設f(n)爲長度爲n的繩子的最大乘積
* 那我們考慮f(n)是從前一次切割中產生的,假設前一次切割的位置
* 是i(1<=i<=n),那麼前一次切割便產生了(i)和(n-i)兩段,那麼便有了
* f(n)=max(f(i)*f(n-i))),最後一次切割肯定是選的能產生最大乘積的
* 兩段,但是我們不能確定i因此只能進行循環搜索,找出最大的方案,同時
* 可以縮減i的搜索範圍[1,2/n],只需要搜索一般即可。
*
* 然後開始考慮初始化問題,分爲兩部分(n<4)和(n>=4),小於4的部分其實最優解是不切割,但是題目要求要切割,因此直接返回即可
* 大於等於4的部分計算時針對f(1)f(2)f(3)直接初始化爲123,因爲這纔是最優解,換句話來說就是大於等於4的繩子當子段切割到長度
* 爲123時便不再切割,這樣纔是最優解
* */
public class Q14 {
public int cuttingRope(int n) {
int maxRe[] = new int[n + 1];
if (n < 2) return 0;
if(n==2) return 1;
if(n==3) return 2;
maxRe[2] = 2;
maxRe[3] = 3;
maxRe[1] = 1;
for (int i = 4; i <= n; i++) {
int max = 0;
for (int j = 1; j <= i / 2; j++) {
max = Math.max(max, (maxRe[j]* maxRe[i - j]));
}
maxRe[i] = max;
}
return maxRe[n];
}
public static void main(String argcp[]){
System.out.println(new Q14().cuttingRope(8));
}
}
leetcode 劍指offer14 割繩子 動態規劃
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.