刷題84 動態規劃(一)

2021-10-05 10:37:18 字數 1366 閱讀 2729

題目鏈結題目描述

給定正整數 n,找到若干個完全平方數(比如 1, 4, 9, 16, …)使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少。

示例 1:

輸入: n = 12

輸出: 3

解釋: 12 = 4 + 4 + 4.

示例 2:

輸入: n = 13

輸出: 2

解釋: 13 = 4 + 9.

題目分析

初始化長度為n+1的陣列,每個位置都以0填充。

遍歷陣列,每個陣列的下標為i,以i為個數最大的結果,即dp[i] = i;

動態轉移方程:dp[i] = math.min(dp[i], dp[i-jj]+1); jj為平方數;

/**

* @param n

* @return

*/var

numsquares

=function

(n)}

return dp[n];}

;

題目鏈結題目描述

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。

示例:輸入: [10,9,2,5,3,7,101,18]

輸出: 4

解釋: 最長的上公升子串行是 [2,3,7,101],它的長度是 4。

說明:可能會有多種最長上公升子串行的組合,你只需要輸出對應的長度即可。

你演算法的時間複雜度應該為 o(n2) 。

題目分析

初始化長度為n+1的陣列,每個位置都以1填充;

定義max存放最長上公升子串行的長度,並賦值為0;

令dp[i]表示以nums[i]為當前最長上公升子串行的長度;

因為新的dp[i](用dp[j]表示)的最長上公升子串行的長度取決於nums[i]這個新的尾元素(用nums[j]表示),所以比較nums[i]和nums[j]的大小;

若nums[j] < nums[i],那麼dp[i] = math.max(dp[i], dp[j]+1);

比較max和dp[i],取較大的值為最長上公升子串行的長度。

/**

* @param nums

* @return

*/var

lengthoflis

=function

(nums)

} max = math.

max(max, dp[i]);

}return max;

};

刷題84 動態規劃(一)

給定正整數 n,找到若干個完全平方數 比如 1,4,9,16,使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少。示例 1 輸入 n 12 輸出 3 解釋 12 4 4 4.示例 2 輸入 n 13 輸出 2 解釋 13 4 9.初始化長度為n 1的陣列,每個位置都以0填充。遍歷陣列,每個陣...

動態規劃 一

在現實生活中,有一類活動的過程,由於它的特殊性,可將過程分程若干個互相聯絡的階段,在它的每一階段都需要作出決策,從而使整個過程達到最好的活動效果。當然,各個階段決策的選取不是任意確定的,它依賴於當前面臨的狀態,又印象以後的發展,當各個階段決策確定後,就組成乙個決策序列,因而也就確定了整個過程的一條活...

動態規劃(一)

動態規劃的兩種常用形式 1 遞迴型 在函式中呼叫自身 優點 直觀,容易編寫 缺點 可能會因為遞迴層數太深導致爆棧,函式呼叫帶來額外時間開銷。無法使用滾動陣列節省空間。總體來說,比遞推型慢。2 遞推型 for迴圈 效率高,有可能使用滾動陣列節省空間。有的問題只能用遞迴解決,有的問題既可以用遞迴,也可以...