《更新提示》
《正文》
你作為禮物收到乙個非常聰明的機械人走在矩形板上。不幸的是,你明白它已經破碎並且行為相當奇怪(隨機)。該板由n行和m列單元組成。機械人最初位於第i行和第j列的某個單元格中。然後在每一步,機械人都可以去另乙個細胞。目的是走到最底層(n.排。機械人可以停留在當前單元格中,向左移動,向右移動或移動到當前單元格下方的單元格。如果機械人位於最左側的列中,則它不能向左移動,如果它位於最右側的列中,則它不能向右移動。在每一步中,所有可能的動作都是同樣可能的。返回預期的步數以到達最下面一行。
在第一行中你將被提供兩個空間隔開的整數n和m(1≤n,m≤?1000)。在第二行中你將得到另外兩個空間隔開的整數i和j(1≤i≤n,1≤j≤m) ——初始行的數目和初始列的數量。注意,(1,1)是板的左上角,(n, m)是右下角。
在自身的一行上輸出預期的步數,小數點後至少有4位數。
10 14
5 14
18.0038068653
顯然,這道題看起來很像一道期望\(dp\),那麼我們就用期望\(dp\)的套路設乙個狀態試試:\(f[i][j]\)代表機械人從\((i,j)\)走到最後一行的步數期望值。
我們可以根據移動規則很容易列出\(dp\)方程:
\(1.\) 當機械人處於第一列時:\(f[i][1]=\frac(f[i][1]+f[i][2]+f[i+1][1])+1\)我們發現,在行維度上,這個狀態轉移方程時沒有問題的,可以倒序列舉每一行作為階段,來進行轉移。\(2.\) 當機械人處於最後一列時:\(f[i][m]=\frac(f[i][m]+f[i][m-1]+f[i+1][m])+1\)
\(3.\) 當機械人處於中間列時:\(f[i][j]=\frac(f[i][j]+f[i][j-1]+f[i][j+1]+f[i+1][j])+1\)
但是,在同一行中,這個狀態轉移方程並不滿足無後效性這一動態規劃基本原則,於是我們決定使用高斯消元演算法來解方程。
總體上,我們還是以行號為階段,倒序進行轉移。在第\(i\)行行內,我們將\(i+1\)行的狀態看為常數,剩下的狀態看做\(m\)個未知數,\(m\)個狀態轉移方程看做數學方程,嘗試列出增廣矩陣。
先看第一類方程:\(f[i][1]=\frac(f[i][1]+f[i][2]+f[i+1][1])+1\),簡單做一下移項分類:
\[2f[i][1]-f[i][2]=f[i+1][1]+3
\]同理,可以化簡剩下兩個方程:
\[-f[i][j-1]+3f[i][j]-f[i][j+1]=f[i+1][j]+4
\]\[-f[i][m-1]+2f[i][m]=f[i+1][m]+3
\]那就可以寫出係數矩陣了:
\[\left[
\begin
2 & -1 & 0 & \cdots & 0 & 0 & 0 & f[i+1][1]+3 \\
-1 & 3 & -1 & \cdots & 0 & 0 & 0 & f[i+1][2]+4 \\
\vdots & \vdots & \vdots & \ddots & \vdots & \vdots & \vdots & \vdots \\
0 & 0 & 0 & \cdots& -1 & 3 & -1 & f[i+1][m-1]+4 \\
0 & 0 & 0 & \cdots& 0 & -1 & 2 & f[i+1][m]+3 \\
\end
\right]
\]我們發現這個矩陣很特殊,總共只有三條斜列有係數,所以我們可以線性直接消元。具體的說,我們可以從上往下消一遍,將第一斜列的係數消去,同時正確地處理第二第三斜列。再從下往上消一遍,將第三斜列的係數消去,這樣就可以直接計算答案了。
利用如上的\(dp\)以及高斯消元演算法,時間複雜度為\(o(nm)\)。
值得注意的是,這三個方程在\(m=1\)是會出現邊界問題,簡單推導可知\(m-1\)時答案就是\((n-x)*2\)。
\(code:\)
#include using namespace std;
const int n = 1020;
int n,m,x,y;
double f[n][n],a[n][n],b[n];
inline void input(void)
inline void init(void)
}inline void dp(void)
{ for (int i=1;i<=m;i++)
f[n][i] = 0;
for (int i=n-1;i>=1;i--)
{init();
b[1] = f[i+1][1] + 3.0;
for (int j=2;j《後記》
後效性 囚徒困境
這道題的狀態設計真是千奇百怪,有的做法每個點開了 8 個狀態,有的做法開了 4 個,我一直嘗試使這個數字變得更少,叉了幾個做法還是沒有成功,所以仍然是 4 個狀態。傳送門 風暴之眼 每種型別都有乙個穩定顏色,也就是說乙個型別的點一旦變成某個顏色就再也不能變化了,因此每個點從開始到結束最多變化一次。因...
什麼是無後效性?
某階段的狀態一旦確定,則此後過程的演變不再受此前各種狀態及決策的影響 現在有乙個四乘四的網格,左上角有乙個棋子,棋子每次只能往下走或者往右走,現在要讓棋子走到右下角 假設棋子走到了第二行第三列,記為s 2,3 如下圖,畫了兩條路線和一條不符合題意的路線,那麼當前的棋子 s 2,3 位置 怎麼走到右下...
消木塊 模型 設計消除後效性
你們中的一些人可能玩過乙個叫做消木塊的遊戲。n個木塊排成一列,每個木塊都有乙個顏色。例如下圖中木塊的顏色分別為 金,銀,銀,銀,銀,銅,銅,銅,金。每次,你都可以點選乙個木塊,這樣被點選的木塊以及和它相鄰並且同色的木塊就會消除。如果一次性消除了k個木塊,那麼就會得到k k分。例如下圖所示,點選銀色木...