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


個人博客頁:https://www.scriptboy.cn/198.html

出處:藍橋杯

題目描述:

X國的一段古城牆的頂端可以看成 2*N個格子組成的矩形(如下圖所示),現需要把這些格子刷上保護漆。

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

 

輸入:

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

 

輸出:

輸出數據為一個正整數。

 

樣例輸入:

樣例輸出:

 

思路:

固定起點,由於如果起點在中間(第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代碼:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM