回文區間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 ...