zoj 1163 The Staircases

/*
zoj_1163    dp
很經典的一題。這題的轉移方程比較難想。 
dp[i][j]=dp[i][j-1]+dp[i-j][j-1] 其中dp[i][j]表示用前j個數(即1--j)表示i的方法數。

注意點:
1.必須用long long
2.初始化dp[0][2]爲什麼是1 ?最後輸出爲什麼是dp[n][n-1]而不是dp[n][n] ?
  舉個例子:dp[7][4]=dp[3][3]+dp[7][3];其中dp[3][3]必然要對應:4.3和4.2.1兩張情況。
  所以dp[0][i]都必須初始化爲1,否則例子中的4.3情況無法表示。而輸出的時候因爲一個數
  最少必須必須分解成兩個數,所以只能取dp[n][n-1]
*/
#include <iostream>
#include <cstdio>
using namespace std;
long long dp[501][501];

int main()
{
    int i,j,n;
    for( i=4;i<501;i++ )    dp[i][2]=0;
    for( i=0;i<4;i++ ) dp[i][2]=1;
    for( i=3;i<501;i++ )
        for( j=0;j<501;j++ )
        {
            if( j>=i ) dp[j][i]=dp[j][i-1]+dp[j-i][i-1];
            else dp[j][i]=dp[j][i-1];
        }
    while( scanf("%d",&n) && n )
        printf( "%lld\n",dp[n][n-1] );
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章