1. 程式人生 > 其它 >動態規劃:洛谷P1002 [NOIP2002 普及組] 過河卒

動態規劃:洛谷P1002 [NOIP2002 普及組] 過河卒

洛谷P1002 [NOIP2002 普及組] 過河卒

 

 

  其實看到這種二維圖,像走迷宮,我就想到了廣度優先搜尋,BFS。但是我發現了卒只能向下走和向右走,我就想到了動態規劃。狀態轉移方程是:dp[i][j]=dp[i-1][j]+dp[i][j-1],然後因為在邊緣的一圈的邊界條件都無法用這個方程,所以我們乾脆讓每個座標都++,不管邊界條件,把起點和終點加加,注意把陣列初始化在main外,這樣可以初始化為0.

上程式碼:

 1 #include<iostream>
 2 using namespace std;
 3 bool vis[25][25];
 4 long long
dp[25][25];//就是 dp 陣列 5 int main() 6 { 7 dp[1][1] = 1; 8 int n, m, x, y; 9 cin >> n >> m >> x >> y; 10 n++;//把每個引數都加1 這樣就不用考慮邊界條件 11 m++; 12 x++; 13 y++; 14 vis[x][y] = 1; 15 vis[x - 2][y - 1] = 1; 16 vis[x - 2][y + 1] = 1; 17 vis[x + 2
][y - 1] = 1; 18 vis[x + 2][y + 1] = 1; 19 vis[x - 1][y + 2] = 1; 20 vis[x - 1][y - 2] = 1; 21 vis[x + 1][y + 2] = 1; 22 vis[x + 1][y - 2] = 1;//標記一下馬的控制點 23 for (int i = 1; i <= n; i++) 24 for (int j = 1; j <= m; j++) 25 { 26 if ((i != 1 || j != 1
)/*就是不考慮1, 1這個點*/ && !vis[i][j]) 27 { 28 dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; 29 } 30 } 31 32 printf("%lld", dp[n][m]); 33 }

 

AC圖:

 

 

結束啦,有空我再用BFS做一下。