动态规划(DP)|URAL 1017. Staircases

动态规划(DP)|URAL 1017. Staircases
文章图片






【动态规划(DP)|URAL 1017. Staircases】这题,写出递推式就过了。用数组zrt[x][n]表示 x个方块在宽度为n的情况下的种类数。
递推式:枚举第一列的高度,然后每一列减去第一列的高度,问题就转化成了若干个zrt [ 剩下的方块数 ] [ n-1 ].
n=2时,有公式 zrt[x][2]=(x-1)/2; 然后再加上记忆化搜索就行了。
代码如下:

long long zrt[501][32]; long long f(int x,int n){ if(zrt[x][n]) return zrt[x][n]; if(x<0) return 0; if(n==2) return (x-1)/2; long long ANS=0; for(int i=1; ; i++){//枚举第一列的高度 if(x-i*n<2) break; ANS+=f(x-i*n,n-1); } return zrt[x][n]=ANS; } long long F(int x){ int high; high=0; while(x>(high+1)*(high+2)/2) high++; long long ANS=0; for(int i=2; i<=high; i++){//枚举x个方格的宽度 ANS+=f(x,i); } return ANS; }int main(void) { long long N; while(cin>>N){ memset(zrt,0,sizeof(zrt)); long long ANS=F(N); cout<






    推荐阅读