leetcode中的動態規劃

2021-10-07 19:21:26 字數 4030 閱讀 3321

1186. 刪除一次得到子陣列最大和

描述:給你乙個整數陣列,返回它的某個 非空 子陣列(連續元素)在執行一次可選的刪除操作後,所能得到的最大元素總和。

換句話說,你可以從原陣列中選出乙個子陣列,並可以決定要不要從中刪除乙個元素(只能刪一次哦),(刪除後)子陣列中至少應當有乙個元素,然後該子陣列(剩下)的元素總和是所有子陣列之中最大的。

注意,刪除乙個元素後,子陣列 不能為空。

子陣列需要是連續的,所以對於當前的元素arr[i]來說,最大值可能是刪除乙個元素,也可能是沒有刪除元素的

maxdel[i]=max(maxnodel[i-1],mamdel+arr[i])

maxnodel[i]=max(maxnodel[i-1]+arr[i],arr[i])

res=max(maxdel,maxnodel)

因為動態規劃只涉及到上乙個元素,所以只需要乙個變數即可

class

solution

return resmax;}}

;

63. 不同路徑 ii

乙個機械人位於乙個 m x n 網格的左上角 (起始點在下圖中標記為「start」 )。

機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角(在下圖中標記為「finish」)。

現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?

解析:1、迭代方程 dp[i][j]=dp[i-1][j]+dp[i][j-1]

2、初始化 dp[0][j]=1 當有障礙物時,所有當前和後續dp[0][j]=0

dp[i][0]=1 當有障礙物時,所有當前和後續dp[i][0]=0

class

solution

for(

int j=

0;j)for

(int i=

1;ireturn dp[r-1]

[c-1];}};

198. 打家劫舍

你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。

給定乙個代表每個房屋存放金額的非負整數陣列,計算你 不觸動警報裝置的情況下 ,一夜之內能夠偷竊到的最高金額。

解析:1.動規方程 dp[i]=max(dp[i-1],dp[i-2]+nums[i]),表示打劫到第i家的最大金錢數

2/初始化 dp[0]=nums[0] dp[1]=max(nums[0],nums[1])

class

solution

return dp[n-1]

;}};

213. 打家劫舍 ii

你是乙個專業的小偷,計畫偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈,這意味著第乙個房屋和最後乙個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。

給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。

class

solution

inthelp

(vector<

int>

& nums)

return dp[n-1]

;}};

1277. 統計全為 1 的正方形子矩陣

給你乙個 m * n 的矩陣,矩陣中的元素不是 0 就是 1,請你統計並返回其中完全由 1 組成的 正方形 子矩陣的個數。

解析:1、dp[i][j]表示以[i][j]為右下角的正方形的數量

1、初始化 若矩陣元素為1,dp初始化為1,若矩陣元素為0,則初始化為0,所以可以用matrix來初始化dp

2動規方程:若矩陣值為1,則dp[i][j]=min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1])

#include

class

solution

}int res=0;

for(

int i=

0;i)return res;}}

;

1289. 下降路徑最小和 ii

給你乙個整數方陣 arr ,定義「非零偏移下降路徑」為:從 arr 陣列中的每一行選擇乙個數字,且按順序選出來的數字中,相鄰數字不在原陣列的同一列。

請你返回非零偏移下降路徑數字和的最小值。

解析:1、dp[i][j]表示到arr[i][j]位置的時候最短便宜路徑

2、初始化 dp[0][j]=arr[0][j]

3、轉移方程 dp[i][j]=min(dp[i-1][j』!=j])+arr[i][j]

class

solution

dp[i]

[j]=tmp+arr[i]

[j];}}

int res= dp[r-1]

[0];

for(

int j=

1;j) res=

min(res,dp[r-1]

[j])

;return res;}}

;

72. 編輯距離

給你兩個單詞 word1 和 word2,請你計算出將 word1 轉換成 word2 所使用的最少運算元 。

你可以對乙個單詞進行如下三種操作:

插入乙個字元

刪除乙個字元

替換乙個字元

分析1、兩個字串比較問題 dp[i][j]表示word1的從0到第i個字元word1[i]和word2的從第0到第j個字元word[j]進行轉換的最少次數

2、初始化dp[0][j]=j dp[i][0]=i

3、轉態轉移方程 dp[i][j]=min(dp[i-1][j],dp[i-1][j-1],dp[i][j-1]),可以通過插入,替換,刪除進行操作轉換到word2

之前把

class

solution

return dp[n1]

[n2];}

};

85. 最大矩形

給定乙個僅包含 0 和 1 的二維二進位制矩陣,找出只包含 1 的最大矩形,並返回其面積。

分析:用動態規劃記錄下遍歷到每一行的面積最大值,並且每次遍歷到當前元素,可找到到當前元為止的遍歷過的最大矩形

1、right[j]記錄遍歷到當前行的最大矩陣的右邊座標 初始化為列數,因為需要取最小值,

cur_r記錄當前行的左邊界,

left[j]記錄遍歷到當前行的最大矩陣的左邊座標 初始化為0,因為需要取最大值,

cur_r記錄當前行的右邊界,

hight[j]記錄遍歷到當前行的最大矩陣的高、初始化為0

right[j] left[j] hight[j]只用記錄到當前行即可,所以用一維即可

2、轉移方程 matrix[i][j]==1 right[j]=min(cur_r,right[j]) left[j]=min(cur_l,left[j])

else right[j]=列數 cur_r=j+1 left[j]=0 cur_r=j

class

solution

else

}for

(int j=

0;j)else

res=

max(res,

(right[j]

-left[j]

)*h[j]);

}}return res;}}

;

leetcode 動態規劃

題目如下 給定乙個整型陣列,至少有乙個元素,請計算子陣列最大乘積是多少?子陣列必須是原陣列中連續的一串數字構成的陣列。整數可正可負。例如 給定陣列 2,3,2,4 經過計算,得到最大乘積為6。子陣列為 2,3 根據原貼的解題思路,這道題可以用動態規劃來解,但難度在 呢?負負得正,就可惡在這裡。那這個...

Leetcode 動態規劃

題目 原題鏈結在這裡 最長字串鏈。給乙個單詞列表,找乙個詞鏈,使得詞鏈後乙個單詞由前乙個單詞增加乙個字元得到,求最長詞鏈長度。解答 1 根據詞鏈的定義,短的單詞可以由長的單詞減去單詞中乙個字元得到。因此可以先對單詞列表,按照單詞的長度從大到小排序。2 單詞的最大長度為 16,因此可以對於每個單詞 w...

leetcode 動態規劃

題目 給定乙個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。每次只能向下或者向右移動一步。示例 輸入 1,3,1 1,5,1 4,2,1 輸出 7 解釋 因為路徑 1 3 1 1 1 的總和最小。思路 定義一維陣列dp用於記錄起始點到某一點最小距離,...