題目鏈結題目描述
給定正整數 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迴圈 效率高,有可能使用滾動陣列節省空間。有的問題只能用遞迴解決,有的問題既可以用遞迴,也可以...