leetcode面の質問14 - I.はロープをカット(パイソン)

ここに画像を挿入説明
ソリューション:

この問題のために再帰的溶液中で使用される場合、ロープの長さを切断することは、反復の一連を生成する再帰的な方法で解決することができるが、
例えば、F(6)を計算するように、F(2)に分けることができ、F(4 ) 計算F(8)、F(4)に分けることができ、F(4 ); (4)反復演算Fを生成し、再帰的トップダウン、我々はこの問題にボトムアップが算出される(動的計画法)を使用することができダブルカウントを減らし、かつ迅速に貪欲なアルゴリズムを計算することができます。

方法の一つ:動的計画

こうして2の最小値N、及び質問、少なくとも一度カット、及び1 1 2に切断の意味;すなわち、N = 2、戻り1;ボトムアップ動的プログラミング問題N> 1、M> 1の意味からそこで、初期値DPを設定する必要が[0] = 0、DP [1] = 1、DP [2] = 1;演算処理において、我々はのための2つを使用し、次に3 = N、Nアップから算出しました。カット実装プロセスへループ。

伝達方程式は、(DP [i]は、最大(J *(IJ)、J * DP [IJ]))MAXです

コードは以下の通りであります:

class Solution:
    def cuttingRope(self, n):

    	if n == 2:
    		return 1
    	

    	dp = [0] * (n+1)
    	dp[0] = 0
    	dp[1] = 1
    	dp[2] = 1


    	for i in range(3,(n + 1)):

    		# max1 = 0

    		for j in range(1,(i//2)+1):

    			dp[i] = max(dp[i], max(j*(i-j), j * dp[i - j]))
    			
    		

    	return dp[n]

上記のコードから分かるように、我々はループのための2つは、使用
のためのループを計算産物のNに最も3からロープの長さ外側、
内側のforループIロープを切断中、最大ロープIの生成物を得るために切断します値、jは、(I // 2)+ 1であることを特徴とする請求の範囲 1、 長さが5の場合ので、その後3,2及び3にカットし、同じ効果です。

状態遷移方程式の意味:

MAX(DP [i]は、最大 (J *(IJ)、J * DP [IJ]))
我々は最高の製品を0に初期化された私は、最初からJ 1つの変化し、切断した後、最大の製品であるロープの長さを削除したいですその後、私はjとIJとなり、その後、私たちはロープを切断継続する、すなわちかどうかを、以下の例を検討する必要があります;私たちの切断ナイフ、変更のナイフ最初のプロセスは、我々は二段カットになってきたので、その4可能です。

  1. Jもはやカット、IJもはやカット
  2. 次にカットJ、IJもはやカット
  3. 次にカットJ、ijは、その後、カット
  4. Jもはやカット、ijは、その後、カット

分析によれば、我々は、その後、唯一残っている第一及び第四のトリミング両方の場合のJ(2,3)を除去することができます。以下の理由:
11 I場合、例えば、ケースは:
jは5であり、ijは6であり;
jは1から5まで変動する、請求;
3、IJ jが8である場合
3~8。
3ないカッティング。
次のように8を切断することができない。
1 、4
2,6-
、3,5-
、4,4-
米国データの3,2,6このセットを見て、
2もはや切断し、6にカット;
。すなわち、最大の製品となる3 2 DP [6]
Jであります5であり、ijはサブプロセス6である。
従って、変化に1を開始するので、切断結果値jが少ないJ以上で貯蔵中に増加すること、従って、無カットjからJ以来。
次のようにそのため、状態遷移方程式は、
MAX(DP [I]、MAX(J *の(IJ)、DP * J【のIJ]))

方法2:貪欲アルゴリズム:
練習の偉大な神を参照してください。
https://leetcode-cn.com/problems/jian-sheng-zi-lcof/solution/mian-shi-ti-14-i-jian-sheng-zi- TAN-XIN-SI-xiang-によって/

アイデアは、3以上カット、大きい物を得ることです。
残りは31で除算された場合、最後の一つは4であり、2×2に切断される。
残りは32で除算された場合、最後のものは2であり
、以下のようなコードです。

class Solution:
    def cuttingRope(self, n):

    	if n == 2:
    		return 1
    	if n == 3:
    		return 2
    	
    	if n % 3 == 0:
    		return 3**(n//3)

    	if n % 3 == 1:
    		return 3**(n//3 - 1) * 4
    	if n % 3 == 2:
    		return 3**(n//3) * 2

添付の動的プログラミング4例のコード:
転写式:
MAX(DP [I]、MAX(J *(のIJ)、DPの[J] *(IJ)、DP * J【のIJ]、DP [J ] * DP [I - J] ))

class Solution:
    def cuttingRope(self, n):

    	if n == 1:
    		return 1
    	if n == 2:
    		return 1
    	

    	dp = [0] * (n+1)
    	dp[0] = 0
    	dp[1] = 1
    	dp[2] = 1


    	for i in range(3,(n + 1)):

    		# max1 = 0

    		for j in range(1,(i//2)+1):

    			dp[i] = max(dp[i], max(j*(i-j), dp[j] * (i-j), j * dp[i - j], dp[j] * dp[i - j]))
    			
    		

    	return dp[n]
公開された100元の記事 ウォンの賞賛3 ビュー10000 +

おすすめ

転載: blog.csdn.net/cy_believ/article/details/104581581