杭电acm1143
首先当n为奇数时显然无解的,输出0;
当n为偶数时,从小看:
n=2时有3种。每增加两列,可以看成一下情况:
1.这两列与之前不相连,单独摆放,有3种,即3*f(n-2);
2.这两列与之前两列中间相连,也就是说中线有横着摆放的(n-2和n-1列),有这种,还可以把底下两个横着的放到顶上,所以有两种情况,把后4列看作整体,即2*f(n-4);
而还有可能n-3与n-4列之间相连,即把后6列看作整体,也有两种,即2*f(n-6),递推之。
********************************************************************
当n为偶数时,从小看:
n=2时有3种。每增加两列,可以看成一下情况:
1.这两列与之前不相连,单独摆放,有3种,即3*f(n-2);
2.这两列与之前两列中间相连,也就是说中线有横着摆放的(n-2和n-1列),有这种,还可以把底下两个横着的放到顶上,所以有两种情况,把后4列看作整体,即2*f(n-4);
而还有可能n-3与n-4列之间相连,即把后6列看作整体,也有两种,即2*f(n-6),递推之。
递推的终点是f(0)=1;f(2)=3;
************************************************************
还有一个是:
mark:递推。dp[n] = 4*dp[n-2]-dp[n-4]
***************************************************
#include <stdio.h> int main() { int d[32]; int n, i, j; //dp[i] = dp[2]*dp[i-2] + 2*(dp[i-4]+dp[i-6]+...+dp[i-(i-2)]+dp[0]) d[0] = 1; d[1] = 0; d[2] = 3; for(i=3; i<32; i++) { if(i%2) { // i is odds d[i] = 0; continue ; } d[i] = d[2] * d[i-2]; for(j=i-4; j>=0; j-=2) d[i] += 2 * d[j]; } while(~scanf("%d", &n) && n!=-1) { printf("%d\n", d[n]); } return 0; }
********************************************************************
# include <stdio.h> int dp[35] = {1, 0, 3, 0} ; int main () { int i, n ; for (i = 4 ; i<= 30 ; i+= 2) dp[i] = 4*dp[i-2] - dp[i-4] ; while (~scanf ("%d", &n)) { if (n < 0) break ; printf ("%d\n", dp[n]) ; } return 0 ; }