題目描述
棋盤上 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
輸出 #1663
3
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的。
雖然這樣已經可以acac#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;
}
ac了,但是,如果仔細想一想,在每一行中,只要上一行的就可以了,所以我們可以用乙個二維度的陣列,一行是當前行,另一行是上一行。
這樣0,1的變化,可以用 ^ 來實現。(1 ^ 1=0,0 ^ 1=1)
再仔細分析第一段**,發現dp[#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;
}
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,這是不考慮有馬的情況,當馬加入圖中後,我們...