過河卒 動態規劃 高精度

2021-06-14 03:50:20 字數 2493 閱讀 8011

題目:過河卒

問題編號:69

如圖,a 點有乙個過河卒,需要走到目標 b 點。卒行走規則:可以向下、或者向右。同時在棋盤上的任一點有乙個對方的馬(如上圖的c點),該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。例如上圖 c 點上的馬可以控制 9 個點(圖中的p1,p2 … p8 和 c)。卒不能通過對方馬的控制點。 

棋盤用座標表示,a 點(0,0)、b 點(n,m)(n,m 為不超過 25 的整數,並由鍵盤輸入),同樣馬的位置座標是需要給出的(約定: c<>a,同時c<>b)。現在要求你計算出卒從 a 點能夠到達 b 點的路徑的條數。

鍵盤輸入

b點的座標(n,m)以及對方馬的座標(x,y)

螢幕輸出

乙個整數(路徑的條數)。

6 6 3 217

一、思路

感覺這是個回溯或者暴力求解的題目,怎麼就可以用動態規劃,發現還真可以

根據題目和加法原理

f(n,m) = f(n-1,m) + f(n, m-1) 上方和左方的可達路徑之和,最優子結構

f(n-1, m) = f(n-2, m) + f(n-1, m-1)

f(n, m-1) = f(n-1, m-1) + f(n, m-2)

重複了f(n-1, m-1) 後面會重複更多,子問題重疊

利用2維陣列來描述f[i][j]

怎麼來遞推求解,初始條件是什麼

原本我想從0.0開始向右,向下,發現要考慮的邊界條件和馬的控制點,太多了

還是從遞推式入手容易,初始條件為

f[0][i],第一行,只像右移動

f[i][0],第一列,只像下移動

然後從1,1開始求解,將馬足控制點設為-2,此點不走,且,如果上或者左側點為它,則把它記為0路徑相加

if (f[i][j]==-2) continue;

f[i][j] = f[i-1][j]<0 ? 0 : f[i-1][j]

f[i][j] += f[i][j-1]<0 ? 0 : f[i][j-1];

因為題目最大資料為50裡取25的排序數,用高精度

所以又加了第三維,來描述位數

二、演算法

f[26][26][2],來描述當走到第i,j位置時的路徑數f[i][j][2](低位為[0],高位為[1])

結構體 horse[9] 來描述定義,9個馬的控制方位,用於初始化為:-2

1、讀入b:n,m ;x,y

2、初始化

f[0][i]和f[i][0]和f[0][0]=1

3、動態規劃求解,二重迴圈

第一重:行

第二重:列

高精度,加法

4、輸出結果f[n][m][0-1]

輸出最高位

補0輸出低位

三、錯誤總結

先是沒有用高精度,只有2個得分點

後面用了,是6個得分點

1630 -->1645 輸出的結果,比正確的少了十幾個路徑數

那麼高精度和動態規劃演算法總體應該是沒問題的,

最後發現是在初始化行列的時候,將n,m位置寫錯導致

終於ac

**如下:

#include #include struct point

;#define bits 10000000

//輸出測試結果

void printf(int f[26][26][2], int n, int m)

} printf(f, n, m);

//初始化第一行

f[0][0][0] = 1;

for (i=1; i<=m; i++)

f[0][i][0] = f[0][i-1][0]<0 ? 0 : f[0][i-1][0];

} //初始化第一列

for (i=1; i<=n; i++)

f[i][0][0] = f[i-1][0][0]<0 ? 0 : f[i-1][0][0];

} printf(f, n, m);

//動態規劃求解

//f(i,j)=f(i-1,j)+f(i, j-1);

for (i=1; i<=n; i++)

f[i][j][0] += f[i-1][j][0]<0 ? 0 : f[i-1][j][0];

f[i][j][1] += f[i-1][j][1];

f[i][j][0] += f[i][j-1][0]<0 ? 0 : f[i][j-1][0];

if (f[i][j][0]>bits)

f[i][j][1] += f[i][j-1][1];

} } printf(f, n, m);

//輸出結果

//找到最高位

i=1;

while (!f[n][m][i])

//輸出最高位

cout<=0; j--)

bit *= 10;

} //輸出0

for (int k=1; k<=7-cnt; k++)

cout<

過河卒(動態規劃)

題目描述 棋盤上aa點有乙個過河卒,需要走到目標bb點。卒行走的規則 可以向下 或者向右。同時在棋盤上cc點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為 馬攔過河卒 棋盤用座標表示,aa點 0,0 0,0 bb點 n,m n,m nn,mm為不超過2020的整數 ...

動態規劃 洛谷 過河卒

第 dp i j 個位置到達的可能性是第 dp i 1 j 個位置方案數 第 dp i j 1 個位置的方案數 題目中馬以 日 字形沿各方向跳出的點才是題目中所謂馬控制的九個點,而不是馬座標周圍的九個點 題目的座標系是以第四象限為平面,卒可向下或向右 dfs求路徑總數要設定邊界 1 到達目的地結束 ...

P1002 過河卒 動態規劃

傳送門 思路 搜尋tle了,只能dp了。dp i j dp i j 1 dp i 1 j 對於 點 i,j 只有 i,j 1 和 i 1,j 這兩種選擇,那麼可以推出狀態轉移方程 先定義dp 0 0 1 dp i j dp i 1 j dp i j 1 但如果這樣的話,以0,0為起點會出現點被覆蓋的...