每一次循环都是基于上一次的位置开始,而且循环的终止条件都相同!可以和杨辉三角联系到一起!另外注意数的存储!
#include <stdio.h>
#include <string.h>
/**< 难道这就是所谓的dp思想,这也太奇葩了! */
int dp[2005][2005];
void set()
{
int i, j;
memset(dp,0,sizeof(dp));
for( i = 1; i <= 2000; i++ )
{
dp[1][i] = i % 1007;
dp[i][i] = 1;
}
for( i = 2; i <= 2000; i++ )
for( j = i+1; j <= 2000; j++ )
dp[i][j] = ( dp[i-1][j-1] + dp[i][j-1] ) % 1007;
}
int main()
{
int case, m, n;
scanf( "%d", &case );
set();
while( case-- )
{
scanf( "%d%d",&m, &n );
printf( "%d\n", dp[m][n] );
}
return 0;
}