P1002 過河卒(動態規劃dp法)

2021-10-09 22:30:00 字數 1669 閱讀 9776

題目描述

棋盤上 aa 點有乙個過河卒,需要走到目標 bb 點。卒行走的規則:可以向下、或者向右。同時在棋盤上 cc 點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為「馬攔過河卒」。

棋盤用座標表示,aa 點 (0, 0)(0,0)、bb 點 (n, m)(n,m),同樣馬的位置座標是需要給出的。

現在要求你計算出卒從 aa 點能夠到達 bb 點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。

輸入格式

一行四個正整數,分別表示 bb 點座標和馬的座標。

輸出格式

乙個整數,表示所有的路徑條數。

輸入輸出樣例

輸入 #1

663

3

輸出 #1

6
說明/提示對於 100% 的資料,1 <= n, m <= 20,0≤ 馬的座標 ≤ 20。

我的思路

核心想法:每個點的路徑條數是該點左邊路徑條數加上上邊路徑條數

dp[i]

[j]= dp[i -1]

[j]+ dp[i]

[j -1]

;

要注意的是:陣列的邊界,給馬的控制點做標記時,要考慮邊界

if

(bx >=

0&& bx <=

20&& by >=

0&& by <=20)

bj[bx]

[by]=-

1;

當計算i – 0 時,只需加上他上邊的路徑條數,相同,j == 0,只需加上左邊的路徑條數。

continue;if

(i ==0)

dp[i]

[j]= dp[i]

[j -1]

;else

if(j ==0)

dp[i]

[j]= dp[i -1]

[j];

我的**

#include

using

namespace std;

int n, m, x, y, bx, by;

long

long bj[30]

[30], dp[30]

[30], z[8]

[2]=

,,,,

,,,}

;int

main()

bj[x]

[y]=-1

; dp[0]

[0]=

1;for(

int i =

0; i <= n; i++)}

cout << dp[n]

[m];

return0;

}

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為起點會出現點被覆蓋的...

P1002 過河卒 (動態規劃 遞推)

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

洛谷P1002 過河卒(動態規劃)

棋盤上a點有乙個過河卒,需要走到目標b點。卒行走的規則 可以向下 或者向右。同時在棋盤上c點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為 馬攔過河卒 棋盤用座標表示,a點 0,0 b點 n,m n,m為不超過20的整數 同樣馬的位置座標是需要給出的。現在要求你計算...