URAL 1017. Staircases

来源:互联网 发布:python和node.js 编辑:程序博客网 时间:2024/05/17 03:09




这题,写出递推式就过了。用数组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<<ANS<<endl;}return 0;}



0 0
原创粉丝点击