1710

来源:互联网 发布:淘宝女装精品装修图片 编辑:程序博客网 时间:2024/05/05 22:13

分析

看到一道题目没有思路时,要先将这道题目简单化。这道题目与“多滋味的咖啡”那道题十分的相似,所以很容易想到递推(DP)。但那么多层,还有可能会有空位,怎么一步一步推出结果呢?

先将此题简单化,变成一维,且不能有空位,这样我们就可以很轻松地实现。
设f[i]为 积木连接成一条长为i的长条的方案总数,则 f[i]=f[i-1]+f[i-2]+…+f[i-k]。

但是再进一步,将题目变成一维,有空位,我们该怎么办呢?

若一段中有一个空格,这样就分成了两部分,然后不断划分,最终若连接成一条长为i的长条,则最终的答案就等于两边的方案数的乘积。

那么最棘手的问题解决了,现在就可以分析原问题了,看一下注意事项:砖块任何部分的正下方都必须要有其他砖块或者是地基。这个是动态规划的关键点,通过这个可以得到一个状态转移方程:

现在设g[i][j]表示:底座长为j,高度出超过i的方案总数。那么:就可以得到从下往上推的步骤,其中f[]存的是一维无空位的情况(见上),按照这个步骤一直往上推g[H][W]就是最终的答案。

for( int i=1; i<=H; i++)    for( int j=0; j<=W; j++) {        g[i][j]=g[i-1][j]%Mod*f[j]%Mod;        for( int k=1; k<=j; k++) {            g[i][j]+=g[i-1][j-k]%Mod*f[j-k]%Mod*g[i][k-1]%Mod, g[i][j]%=Mod;            //用到的是上面含空格两边相乘的原理        }    }

理解好上面的程序段,解决这道问题就不难了。

1 0
原创粉丝点击