又是洛谷題,要不是有小姐姐不會,我才不想動腦子。先貼一下題目位址
再貼一下題目:
我們讀一下題目,這可不比學校的**演算法題,讀完一遍沒啥感覺。我意識到需要畫圖了,(噢,我垃圾的畫圖技術)
因為卒只能向下或者向右,也就是說,除了第一行第一列之外,當前索引上的元素的值都僅由其上方元素與前方元素共同決定。(圖中5,6寫錯應該是1)
a表示卒所在的地方, b表示目的地,m表示馬,紅色的座標表示封鎖區,格仔裡的數字表示走到該位置有多少方法。現在我們可以輕易的從圖中輕易的發現 map[i,j] = map[i-1, j] + map[i, j-1]; 所以我們可以很輕鬆的得出狀態轉移方程
map[1][1] = 1;針對沒有max又不想寫的我,我略微改動了一下狀態方程:map[i][j] = max(map[i-1][j]+map[i][j-1]);//c語言裡沒有max自己寫乙個去
map[1][0] = 1;利用了一下空出來的0列,為什麼要空出0行和0列呢?因為這個方程map[i-1][j]+map[i][j-1] 取到0會產生陣列越界然後就remap[i][j] = map[i-1][j]+map[i][j-1];
順便說一下為了避免陣列越界所以我把輸入的資料全部+1,這樣就避免了記憶體洩漏,這道題還專門說明了資料會很大,所以應該用longlong。解決了這幾點之後我們就可以寫**了
巴拉巴拉~
貼**:
#include #includeview code#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;
}
切記,自己先寫。
洛谷 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的整數 同樣馬的位置座標是需要給出的。現在要求你計算...