題目:現在有乙個城市銷售經理,需要從公司出發,去拜訪市內的商家,已知他的位置以及商家的位置,但是由於城市道路交通的原因,他只能在左右中選擇乙個方向,在上下中選擇乙個方向,現在問他有多少種方案到達商家位址。
給定乙個地圖map及它的長寬n和m,其中1代表經理位置,2代表商家位置,-1代表不能經過的地區,0代表可以經過的地區,請返回方案數,保證一定存在合法路徑。保證矩陣的長寬都小於等於10。
例: 輸入:[[0,1,0],[2,0,0]],2,3
輸出:2
思路:這個題目簡單一點想,就是需要我們從給定的大矩陣中找出乙個由 經理和商家組成的小矩陣,來進行dp動態規劃。根據題目:每次只能在左右選擇乙個方向,在上下選擇乙個方向。
我們根據小矩陣找dp。
dp[i][j]的意義是i,j這個點到x1,y1這個點的有多少種。
dp 遞推公式這裡為分為兩種:
在主對角線也就是我們圖上第一種情況:
dp[i][j] = map[i][j]==-1?0:dp[i-1][j]+dp[i][j-1];
在副對角線也就是我們圖上第二種情況:
dp[i][j] = map[i][j]==-1?0:dp[i-1][j]+dp[i][j+1];
根據以上思路可以寫出:
/**
* step1:先找到經理和商家的位置,用(x1,y1)記錄經理,用(x2,y2)記錄商家
* step2:判斷行走方向,兩條行走方向副對角線和主對角線
*@param map
*@param n
*@param m
*@return
*/public
intcountpath(int map, int n, int m) else
if(map[i][j]==2)}}
//如果經理和商店位置相同 就不需要走
if (x1==x2&&y1==y2)
//這裡用x1儲存x座標較小的乙個方便計算
if (x1>x2)
int dp=new
int[n][m];
//在主對角線
if(y1// 兩點處在主對角線上
dp[x1][y1] = 1;
//先把外圈的賦值防止陣列越界
for (int i = x1+1; i<=x2; i++)
for (int j = y1+1; j <=y2; j++)
for (int i = x1+1; i <= x2; i++)
}}else
for (int j = y1-1; j >=y2; j--)
for (int i = x1+1; i <= x2; i++) }}
return dp[x2][y2];
}
美團筆試題 拜訪
題目描述 現在有乙個城市銷售經理,需要從公司出發,去拜訪市內的商家,已知他的位置以及商家的位置,但是由於城市道路交通的原因,他只能在左右中選擇乙個方向,在上下中選擇乙個方向,現在問他有多少種方案到達商家位址。給定乙個地圖map及它的長寬n和m,其中1代表經理位置,2代表商家位置,1代表不能經過的地區...
美團點評筆試題
1.css中浮動的影響和清除浮動的方法 2.sjf演算法,完成時間 3.有向圖和無向圖的鄰接矩陣有什麼區別 4.乙個無向圖的鄰接矩陣中各元素之和是圖中邊的條數的兩倍.5.20個元素氣泡排序,最多相鄰元素的比較次數?6.資料流圖中加工編號 7.長度為32的有序表中進行二分查詢,平均查詢長度?8.fir...
牛客(美團) 拜訪(動態規劃)
現在有乙個城市銷售經理,需要從公司出發,去拜訪市內的商家,已知他的位置以及商家的位置,但是由於城市道路交通的原因,他只能在左右中選擇乙個方向,在上下中選擇乙個方向,現在問他有多少種方案到達商家位址。給定乙個地圖map及它的長寬n和m,其中1代表經理位置,2代表商家位置,1代表不能經過的地區,0代表可...