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