洛谷P1002 過河卒

2022-06-13 04:03:09 字數 1843 閱讀 9392

又是洛谷題,要不是有小姐姐不會,我才不想動腦子。先貼一下題目位址

再貼一下題目:

我們讀一下題目,這可不比學校的**演算法題,讀完一遍沒啥感覺。我意識到需要畫圖了,(噢,我垃圾的畫圖技術)

因為卒只能向下或者向右,也就是說,除了第一行第一列之外,當前索引上的元素的值都僅由其上方元素與前方元素共同決定。(圖中5,6寫錯應該是1)

a表示卒所在的地方, b表示目的地,m表示馬,紅色的座標表示封鎖區,格仔裡的數字表示走到該位置有多少方法。現在我們可以輕易的從圖中輕易的發現 map[i,j] = map[i-1, j] + map[i, j-1]; 所以我們可以很輕鬆的得出狀態轉移方程

map[1][1] = 1;

map[i][j] = max(map[i-1][j]+map[i][j-1]);//c語言裡沒有max自己寫乙個去

針對沒有max又不想寫的我,我略微改動了一下狀態方程:

map[1][0] = 1;

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

利用了一下空出來的0列,為什麼要空出0行和0列呢?因為這個方程map[i-1][j]+map[i][j-1] 取到0會產生陣列越界然後就re

順便說一下為了避免陣列越界所以我把輸入的資料全部+1,這樣就避免了記憶體洩漏,這道題還專門說明了資料會很大,所以應該用longlong。解決了這幾點之後我們就可以寫**了

巴拉巴拉~

貼**:

#include #include 

#define debug 0

#define format \bx++; \

by++; \

hx++; \

hy++; \

map[

1][0] = 1

; \ h_map[hx][hy] = 1

;typedef

long

long

ll;typedef unsigned

char

uchar;

ll map[

25][25] = ;

bool h_map[25][25] = ;

//限制點

const

int hforbidx = ;

const

int hforbidy = ;

intmain()

for (int i = 1; i <= bx; i++)

//狀態轉移方程

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

];//

測試點2

#if debugprintf(

"map[%d][%d] = %d\n

", i, j, map[i][j]);

if (0 == j % 5

)

#endif

//debug

} }

printf(

"%lld\n

", map[bx][by]);

return0;

}

view code

切記,自己先寫。

洛谷 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,這是不考慮有馬的情況,當馬加入圖中後,我們...

洛谷 P1002 過河卒

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