日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

过河卒(简单dp)

發布時間:2024/9/3 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 过河卒(简单dp) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鏈接:https://ac.nowcoder.com/acm/contest/1077/H
來源:牛客網

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 32768K,其他語言65536K
64bit IO Format: %lld
題目描述

如圖,A 點有一個過河卒,需要走到目標 B 點。卒行走規則:可以向下、或者向右。同時在棋盤上的任一點有一個對方的馬(如上圖的C點),該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。例如上圖 C 點上的馬可以控制 9 個點(圖中的P1,P2 … P8 和 C)。卒不能通過對方馬的控制點。

棋盤用坐標表示,A 點(0,0)、B 點(n,m)(n,m 為不超過 20 的整數,并由鍵盤輸入),同樣馬的位置坐標是需要給出的(約定: C<>A,同時C<>B)。現在要求你計算出卒從 A 點能夠到達 B 點的路徑的條數。
輸入描述:
輸入B點的坐標(n,m)以及對方馬的坐標(X,Y){不用判錯}
輸出描述:
輸出一個整數(路徑的條數)。
示例1
輸入
復制

6 6 3 2

輸出
復制

17

記錄一下這題簡單的dp的兩種寫法:
現在的寫法:
/*
加上初始化,感覺這樣更好理解
*/
code1:

#include <iostream> using namespace std; int step_x[]= {-1,-2,-2,-1,1,2,2,1}; int step_y[]= {-2,-1,1,2,-2,-1,1,2}; bool vis[25][25]; int n,m,x,y; long long dp[25][25]; void init() {vis[x][y] = true;for(int i = 0; i < 8; i++){int xx = x + step_x[i];int yy = y + step_y[i];if(xx>=0&&xx<=n&&yy>=0&&yy<=m){vis[xx][yy] = true;}}/*第0行,第0列,初始化,如果遇到一個馬控制點,從 這個馬控制點 開始 都不可達!!!*/for(int i = 0; i <= n; i++){if(!vis[i][0])dp[i][0] = 1;elsebreak;}for(int i = 0; i <= m; i++){if(!vis[0][i])dp[0][i] = 1;elsebreak;} } int main() {cin>>n>>m>>x>>y;init();for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){if(!vis[i][j])dp[i][j] = dp[i-1][j] + dp[i][j-1];}}cout<<dp[n][m]<<endl;return 0; }

code2:
之前的寫法:
/*
所有格子移動一格,留出第0行,第0列,這樣可以省去初始化,但不是很好理解
*/

#include <iostream> using namespace std; typedef long long LL; int step_x[]= {-1,-2,-2,-1,1,2,2,1}; int step_y[]= {-2,-1,1,2,-2,-1,1,2}; bool vis[25][25]; int n,m,x,y; LL dp[25][25]; void init() {dp[1][1] = 1;vis[x][y] = true;for(int i = 0; i < 8; i++){int xx = x + step_x[i];int yy = y + step_y[i];if(xx>=0&&xx<=25&&yy>=0&&yy<=25){vis[xx][yy] = true;}}} int main() {cin>>n>>m>>x>>y;n++,m++;x++,y++;init();for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){if(!vis[i][j])dp[i][j] = max(dp[i-1][j]+dp[i][j-1],dp[i][j]);}}cout<<dp[n][m]<<endl;return 0; }

總結

以上是生活随笔為你收集整理的过河卒(简单dp)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。