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;
}