洛谷P1002題解 zhengjun

2021-10-02 16:38:24 字數 3115 閱讀 2891

題目描述

棋盤上 a

aa 點有乙個過河卒,需要走到目標 b

bb 點。卒行走的規則:可以向下、或者向右。同時在棋盤上 c

cc 點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為「馬攔過河卒」。

棋盤用座標表示,a

aa 點 (0,

0)(0, 0)

(0,0)、b

bb 點 (n,

m)(n, m)

(n,m

),同樣馬的位置座標是需要給出的。

現在要求你計算出卒從a

aa 點能夠到達 b

bb 點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。

輸入格式

一行四個正整數,分別表示 b

bb 點座標和馬的座標。

輸出格式

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

輸入輸出樣例

輸入 #1

663

3

輸出 #1
6
說明/提示

對於100

%100 \%

100%

的資料,1≤n

,m≤20

,0≤馬

的座標≤

201 \le n, m \le 20,0 \le 馬的座標 \le20

1≤n,m≤

20,0

≤馬的坐

標≤20

。首先,可以打搜尋,但這樣,乙個點就會被搜到好多次,複雜度太高,所以,最好用動態規劃。

公式很簡單,乙個點,要麼從它上面的點走來,要麼從它左邊的點走來,所以公式就是f[i

][j]

=f[i

−1][

j]+f

[i][

j−1]

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

f[i][j

]=f[

i−1]

[j]+

f[i]

[j−1

]這個很好理解。

最後,加lon

glon

glong long

longlo

ng,雖然範圍不大,但是,一次一次疊加,會爆int

intin

t的。

#include

#define maxn 23

using

namespace std;

int n1,m1,x2,y2;

long

long dp[maxn]

[maxn]

;int

abs(

int x)

intmain()

} cout<

[m1]

;//遞推結束

return0;

}

雖然這樣已經可以acac

ac了,但是,如果仔細想一想,在每一行中,只要上一行的就可以了,所以我們可以用乙個二維度的陣列,一行是當前行,另一行是上一行。

這樣0,1的變化,可以用 ^ 來實現。(1 ^ 1=0,0 ^ 1=1)

#include

#define maxn 23

using

namespace std;

int n1,m1,x2,y2;

long

long dp[2]

[maxn]

;int

abs(

int x)

intmain()

if(i==

1&&j==1)

continue

; dp[ii]

[j]=dp[ii^1]

[j]+dp[ii]

[j-1];

}}cout<

[m1]

;//注意不是dp[1][m1]

return0;

}

再仔細分析第一段**,發現dp[

i][j

]dp[i][j]

dp[i][

j]是由d p[

i−1]

[j],

dp[i

][j−

1]dp[i-1][j],dp[i][j-1]

dp[i−1

][j]

,dp[

i][j

−1]兩個子問題遞推而來的。然而,能否保證再求dp[

i][j

]dp[i][j]

dp[i][

j]時,使dp[

i−1]

[j],

dp[i

][j−

1]dp[i-1][j],dp[i][j-1]

dp[i−1

][j]

,dp[

i][j

−1]能夠知道。

其實,只要一維陣列,讓j

jj從1到m1m1

m1,每次如果不會被馬攔截,就直接加上dp[

j−1]

dp[j-1]

dp[j−1

],因為當前的未更新的dp[

j]dp[j]

dp[j

]就是上一層的dp[

j]dp[j]

dp[j]。

所以,可以再把二維度化為一維度。

#include

#define maxn 23

using

namespace std;

int n1,m1,x2,y2;

long

long dp[maxn]

;int

abs(

int x)

intmain()

if(i==

1&&j==1)

continue

; dp[j]

+=dp[j-1]

;}} cout<

;return0;

}

洛谷題解P1002 過河卒

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

洛谷 P1002 過河卒

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

洛谷P1002過河卒

dp水題,我都會做 我們考慮地圖上i,j的位置可以怎麼過來,因為卒只能向下或向右,所以當前位置只能由它的上方或左方轉移過來,所以f i j f i 1 j f i j 1 然後考慮邊界情況,沿著上沿和左沿只能向乙個方向走,所以f i 0 0,f 0 i 0,這是不考慮有馬的情況,當馬加入圖中後,我們...