力扣 動態規劃(DP)問題分類彙總(二)

2021-10-24 01:21:46 字數 1870 閱讀 1525

回文區間dp模板:

for

(int i =

0; i < n; i ++

)for

(int i = n -

1; i >=

0; i --

)}

題目一:回文子串(647. 回文子串)

題解:對於字串的dp,一般要用二維陣列求解。引入兩個指標dp[i][j],這個狀態是字串區間dp[i + 1][j - 1]轉移而來的,結果是有s[i] == s[j]是否成立來確定。

**如下:

class

solution

int n = s.

length()

;boolean

dp =

newboolean

[n][n]

;// 統計數量

int res =0;

for(

int i =

0; i < n; i ++

)for

(int i = n -

1; i >=

0; i --)}

}return res;

}}

題目二:最長回文子串(516. 最長回文子串行)

題解:建立boolean的dp二維陣列,判斷dp[i][j]是否為回文字串。並記錄最長長度和起始位置。

class

solution

int n = s.

length()

;boolean

dp =

newboolean

[n][n]

;for

(int i =

0; i < n ; i ++

)int len =

0, maxlen =

1, index =0;

for(

int i = n -

1; i >=

0; i --

)// 儲存最長回文長度和起始位置

if(dp[i]

[j]&& len > maxlen)}}

return s.

substring

(index, index + maxlen);}

}

題目一:292. nim 遊戲(292. nim 遊戲)

題解:***[i]表示石頭數量為i時自己的輸贏情況。dp[i]的結果要看dp[i - 1],dp[i - 2],dp[i - 3]中有false的即自己這次可以贏。否則就是輸了。狀態轉移方程:

dp[i] = !dp[i - 1] || !dp[i - 2] || !dp[i - 3];

**如下:

class

solution

// boolean dp = new boolean[n + 1];

// dp[1] = true;

// dp[2] = true;

// dp[3] = true;

// for (int i = 4; i <= n; i ++)

// return dp[n];

// 第二種方法

// if (1 == n || 2 == n || 3 == n)

// if (n % 4 != 0)

// boolean dp_1 = true, dp_2 = true, dp_3 = true, dp = false;

// for (int i = 4; i <= n; i ++)

// return dp;

// 第三種方法:數學規律

return n %4!=

0;}}

力扣 動態規劃

設爬x層的梯子的方法有f x 種,那麼f x f x 1 f x 2 爬1層梯子的方式有一種 爬2層梯子的方式有兩種 爬3層梯子的方式有三種 爬4層梯子的方式有五種 classsolution int rev newint n 1 rev 0 0 rev 1 1 rev 2 2 for inti 3...

力扣動態規劃問題求解思路

定義 動態規劃演算法是通過拆分問題 定義問題狀態和狀態之間的關係,使得問題能夠以地推 或者說分治 的方法解決。動態規劃演算法的基本思想與分治法類似,也是將待求解的問題分解為若干個子問題 階段 按順序求解子階段,前一子問題的解,為後一子問題的求解提供了有用的資訊。在求解任一子問題時,列出各種可能的區域...

力扣 動態規劃 最低票價

問題描述 在乙個火車旅行很受歡迎的國度,你提前一年計劃了一些火車旅行。在接下來的一年裡,你要旅行的日子將以乙個名為 days 的陣列給出。每一項是乙個從 1 到 365 的整數。火車票有三種不同的銷售方式 一張為期一天的通行證售價為 costs 0 美元 一張為期七天的通行證售價為 costs 1 ...