格子刷油漆【動態規劃問題】—NYOJ 980

我的博客頁:https://www.scriptboy.cn/198.htmlhtml

出處:藍橋杯c++

題目描述:eclipse

X國的一段古城牆的頂端能夠當作 2*N個格子組成的矩形(以下圖所示),現須要把這些格子刷上保護漆。ide

你能夠從任意一個格子刷起,刷完一格,能夠移動到和它相鄰的格子(對角相鄰也算數),但不能移動到較遠的格子(由於油漆未乾不能踩!)
好比:a d b c e f 就是合格的刷漆順序。
c e f d a b 是另外一種合適的方案。
當已知 N 時,求總的方案數。當N較大時,結果會迅速增大,請把結果對 1000000007 (十億零七) 取模。spa

 

輸入:.net

輸入數據爲一個正整數(不大於1000)code

 

輸出:htm

輸出數據爲一個正整數。blog

 

樣例輸入:seo

樣例輸出:

 

思路:

固定起點,因爲若是起點在中間(第2~N-1列)能夠分爲左右兩邊來討論,這時起點都是角格子。假如a[i]表示2*i的格子從左上角開始刷刷完全部格子的方案數(其中i表示列數,1<=i<=N),有三種刷法刷完全部格子:

  1. 先向下刷(即先刷左下角),向下刷完以後有兩種方法跳到下一列,刷完剩下的i-1列須要2*a[i-1]
  2. 向下一列刷,最後刷左下角,能夠看出不能同列刷,只能一直向右刷,且在沒有到最後一列以前是不能返回,因此刷完全部格子有2^i個方案;(此種狀況比較特殊,後面須要還要用到,因此單獨用b[i]存儲下來)
  3. 向下一列刷,有兩種方案到下一列,而後返回左下角,再刷下一列未刷格子以後,而後有兩種方案再到下一列,可見有四種方案到下下列,因此刷完全部格子有4*a[i-2]個方案;

總之,就是左下角格子何時刷,形成了不一樣的狀況。若是是起點不在角格子上,不難看出,能夠將左右兩側分割成2*i2*(N-i)的矩形,須要其中一個矩形使用第2種刷法刷才能回到另外一個矩形中。

參考:https://blog.csdn.net/roosevelty/article/details/50706322

 

AC代碼:

相關文章
相關標籤/搜索