題目:格仔刷油漆
題意:要遍歷2行n列的格仔,一次只能遍歷四周,遍歷過就不能再遍歷,問有多少種遍歷方法(起點也任意,只要能遍歷完所有格仔就可以)
思路:
分兩大塊:
1.從某乙個角落出發:a[n]
比如從a點出發,因為要遍歷所有的格仔,所以要想遍歷同一列的d,就只有三種方法:
1. 直接到d,然後再遍歷bcef這塊,那麼這種情況的數量就是2*a[n-1],因為b、e你可以選乙個開始,所以乘2。
2. 先遍歷右邊所有格仔,最後回到d點,把這種走法的數量記錄在d陣列,那麼d[n]=2*d[n-1],同樣,b、e可以選乙個。
3. 先遍歷b、e中的乙個再遍歷d再遍歷b、e中的另乙個,再遍歷cf後面的,這種情況的數量是2*2*a[n-2],因為b、e可以選乙個,c、f也可以選乙個。
很容易可以理解只有前面三種情況才可能從a出發遍歷到d,那麼從角落出發的情況總數為:4*a[n]; a[n]=d[n]+2*a[n-1]+4*a[n-2];
2.從中間的某個格仔從發:
如果從中間的某個格仔出發,那麼肯定要先遍歷完左邊所有格仔或者右邊所有格仔才能遍歷同一列的格仔,不然就隔斷了,那麼對於第i列,他的情況數量為:2*(2*d[i-1]*2*a[n-i]+2*d[n-i]*2*a[i-1]);
分成上面兩種情況後,問題就很簡單了,只要將兩種情況所有可能加起來就可以得到答案了。
1 #include2#define mod 1000000007
3 typedef long
long
ll;4
5 ll d[1010
];6 ll a[1010];7
8int
main()
921 ll sum=0
;22 a[1]=1,a[2]=6;23
for(int i=3;i<=n;i++)
2427 sum=4*a[n];
28for(int i=2;i)
2932 printf("
%i64d\n
",sum);33}
34return0;
35 }
格仔刷油漆
x國的一段古城牆的頂端可以看成 2 n個格仔組成的矩形 如圖1所示 現需要把這些格仔刷上保護漆。你可以從任意乙個格仔刷起,刷完一格,可以移動到和它相鄰的格仔 對角相鄰也算數 但不能移動到較遠的格仔 因為油漆未乾不能踩!比如 a d b c e f 就是合格的刷漆順序。c e f d a b 是另一種...
格仔刷油漆(DP)
格仔刷油漆 x國的一段古城牆的頂端可以看成 2 n個格仔組成的矩形 如圖1所示 現需要把這些格仔刷上保護漆。你可以從任意乙個格仔刷起,刷完一格,可以移動到和它相鄰的格仔 對角相鄰也算數 但不能移動到較遠的格仔 因為油漆未乾不能踩!比如 a d b c e f 就是合格的刷漆順序。c e f d a ...
格仔刷油漆(dp)
格仔刷油漆 x國的一段古城牆的頂端可以看成 2 n個格仔組成的矩形 如圖1所示 現需要把這些格仔刷上保護漆。你可以從任意乙個格仔刷起,刷完一格,可以移動到和它相鄰的格仔 對角相鄰也算數 但不能移動到較遠的格仔 因為油漆未乾不能踩!比如 a d b c e f 就是合格的刷漆順序。c e f d a ...