杭电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),递推之。

递推的终点是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 ;
}


posted @ 2015-12-21 14:26  StevenLuke  阅读(113)  评论(0编辑  收藏  举报