之前看過dp二維安排行程的題目,好像可以套用到這題上來:
先令dp狀態:dp[i][j][k]中含有(k = 0)從左邊走來的、(k = 1)從上面走來的、(k = 2)從右邊走來的,轉移式也就是:dp[i][j][k] = 自己的經驗值+max(前一格的最佳情況)。
但這樣還不是很清楚,所以繼續說:
由於題目說不能走重複的,也就是說dp[i][j][2]不可能會是dp[i][j+1][0],這樣就觸發了左邊走來再走回去的現象。
換句話說可以把橫列中每格的k = 0先由左至右處理好,再由右至左處理k = 2,至於k = 1...跟左右完全無關,但必須在一開始就處理。
順序:
1.先把每格的k = 1設為上一列(dp[i-1][j])的max+自己的經驗
2.再來是由左至右把k = 0設為左邊那格k = 0,k = 1取max+自己的經驗
3.k = 2同理,設為右邊那格k = 1,k = 2取max+自己的經驗。
dp初始值記得取極小值,可以用-0x3f3f3f3f,整數狀態加減都很難逾值的安全極小值。
還有要小心邊界處理,左邊沒人的k = 0就直接不要管他(右邊沒人同理),保持-0x3f3f3f3f
以及第一列要特別處理,因為第一列可以從任意點開始,稍微想想k = 1要怎麼改