hdu2067-小兔的棋盘

http://acm.hdu.edu.cn/showproblem.php?pid=2067

如图所示 , 矩阵关于y  = - x 即 x == y对称, 因此只需要算出其中的一半,然后乘二即可 ,第一行所有的数据均只能由左边传递过来 ,因此dp[ 0 ][ j ] =1 ;

其他的路径均可以通过上和左边传递过来,因此dp[ I ][ j ] = dp[ i - 1][ j ]  + dp[ i ] [ j - 1 ];

但是需要注意的地方是当i==j 的时候,因为图形只算了一半,所以这里需要特别考虑,因此当i== j的时候只能通过上边传递过来,所以,当 i == j 的时候,dp[ i ][ j ] = dp[ i - 1 ][ j ];



 

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "math.h"
#include "algorithm"
#include "iostream"

using namespace std;
#define maxn 10005 
long long  dp[ maxn ][ maxn ];
 
int main()
{
	int i , j , n ;
	for( i = 1 ; i <= 35 ; i++ )
		dp[ 0 ][ i ] = 1 ;
	for( i = 1 ; i <= 35 ; i++ )
	{
		for( j = 1 ; j <= 35 ; j++ )
		{
			if( j == i ) 
				dp[ i ][ j ] = dp[ i - 1 ][ j ] ;
			else
				dp[ i ][ j ] = dp[ i - 1 ][ j ] + dp[ i ][ j - 1 ] ;
		}
	}
	int Case = 0 ;
	while( ~scanf( "%d" , &n ) )
	{
		if( n == -1 )
			break;
		printf( "%d %d %I64d\n" , ++Case , n , dp[ n ][ n ] * 2 ) ;
	} 
	return 0;
}


 

 

posted @ 2013-05-21 20:44  javawebsoa  Views(214)  Comments(0Edit  收藏  举报