1. 程式人生 > >動態規劃---街道問題(類似過河卒)

動態規劃---街道問題(類似過河卒)

一、問題描述

    設有一個N*M(l≤ N≤50, l≤ M≤ 50)的街道。n和m表示橫豎街道數。
  規定行人從A(1,1)出發,在街道上只能向東或北方向行走。
  N=3,M=3的街道圖,從A出發到達B共有6條可供行走的路。
  若在N*M的街道中,設定一個矩形障礙區域(包括圍住該區域的街道和點)不讓行人通行。
  此矩形障礙區域用2對頂點座標給出,前圖中的2對頂點座標為:(2,2),(8,4),此時從 A出發到達B的路徑僅有兩條。
  程式要求:
  任務一:給出N,M後,求出所有從A出發到達B的路徑的條數。
      任務二:給出N,M,同時再給出此街道中的矩形障礙區域的2對頂點座標(X1,y1), (X2,Y2),然後求出此種情況下所有從A出發到達B的路徑的條數。
  如果答案太大,輸出最後20位。 輸入格式   第一行兩個數n和m。
  第二行為X1,Y1,X2,Y2.如果是任務一,則第二行為4個0. 輸出格式   輸出走路方案數。 樣例輸入 3 3
0 0 0 0 樣例輸出 6 樣例輸入 50 50
2 2 49 49 樣例輸出 2 資料規模和約定   1<=N,M<=50 解析
   求解從矩形左下角到右上角的方案數。   ①我們發現,初始在(1,1)的位置,然後第一步走出的位置可以為:(1,2)、(2,1),其座標之和為3    以此類推,第二步到達的點座標之和為4,第三步到達的點座標之和為5。。。    我們用f[i][j]表示從起點到達(i,j)的方案數,則有:f[i][j]=f[i-1][j]+f[i][j-1];    flag[i][j]表示(i,j)點能否通過。    於是得到遞推式:    for(k=3;k<=n+m;k++)     for(i=1;i<=n;i++)      {         j=k-i;       f[i][j]=f[i-1][j]+f[i][j-1];
     }    當然,還要保證上述的點都是有效的,能通過的。  ②本題的第二個難點,結果可能很大,保留最後20位即可,但是最大的unsigned long long 也不過剛好20位,顯然是存不下的。這個時候就只有用高精度了。
  但是隻要儲存最後20位,所以直接假設ans是一個20位的整數,前10用d1來儲存,後10位用d2來儲存,這樣只要在想家的過程中稍作處理即可,而不用真的去寫一個高精度。