思路:dp,這種可以劃分為子問題的題目都可以用dp來做;主要是思考的過程;
如[1,2,3,4,5]
(1)等差資料需要3個數字,故從3開始計算,需要判斷以3為結尾的組合數
(2)res需累計以各個位置為尾部的組合個數
(3)dp[i] = dp[i - 1] + 1,表示以dp[i]為尾部的組合個數,例如,5位置,為什麼是3呢(4位置的個數為1234、234共2個等差數列,而5的位置包含了4位置開始的2個等差數列 + 345這個等差數列)
int numberofarithmeticslices(vector& nums)
int res = 0;
vectordp(nums.size(), 0);
for (int i = 2; i < nums.size(); i++)
//累加和
res += dp[i];
}return res;
}
優化dp vector
int numberofarithmeticslices(vector&nums)
//用i_value和i_value_代替dpi]和dp[i-1]
int i_value = 0, i_value_ = 0;
int res = 0;
for (int i = 2; i < nums.size(); i++) else
res += i_value;
}return res;
}
leetcode 446 等差數列劃分ii
可降問題擴充套件到以i為尾部所得到的等差數列組合數,故還是使用dp進行操作;
因為沒有其他資訊使用,故只能迴圈進行遍歷,時間複雜度為o(n^2)
一維陣列只能儲存位置i和位置j之間的關係,無法儲存第三個數之間關係,故採用二位陣列;
dp[i][diff] 子問題:表示以i為尾部,等差值diff的弱等差數列個數(大於等於2個數值);dp[j][diff] 同樣是以j為開始i為結尾 等差值 diff 的弱等差數列個數; 因為等差數列是以3個數值為起點,故不能加dp[i][diff],這時加dp[j][diff]則可以保證是等差數列個數(因為:當diff = nums[i] - nums[j]已經存在dp[j][diff]中的話,說明之前已經有差值為diff的弱等差數列了,所以,只需要加這部分即可)
int numberofarithmeticslices(vector&nums)
int res = 0;
vector> dp(nums.size());
for (int i = 0; i < nums.size(); i++)
}return res;
}
Leetcode動態規劃(2) 中等)
簡單記錄刷題的過程 大佬勿噴 一和零多維0 1揹包問題 把題目給定的 0 的數量看成乙個揹包,1的數量看成另乙個揹包,把陣列中的每乙個字串看成一件件商品,統計每乙個字串 0 和 1的數量,動態規劃填表 狀態轉移方程 dp i j max dp i j 1 dp i count0 j count1 其...
分割等和子集 leetcode416
給定乙個只包含正整數的非空陣列。是否可以將這個陣列分割成兩個子集,使得兩個子集的元素和相等。注意 每個陣列中的元素不會超過 100 陣列的大小不會超過 200 示例 1 輸入 1,5,11,5 輸出 true 解釋 陣列可以分割成 1,5,5 和 11 示例 2 輸入 1,2,3,5 輸出 fals...
LeetCode 127 中等 單詞接龍
給定兩個單詞 beginword 和 endword 和乙個字典,找到從 beginword 到 endword的最短轉換序列的長度。轉換需遵循如下規則 每次轉換只能改變乙個字母。轉換過程中的中間單詞必須是字典中的單詞。說明 示例 1 輸入 beginword hit endword cog wor...