动态规划训练之十七

https://projecteuler.net/problem=638

题目描述:

求所有(0,0)走到(n,m)路线(k^矩形个数)

分析:

考虑如果只是求方案数的话

很简单一个递推dp[i,j]=dp[i-1,j]+dp[i,j-1];

也是一个组合数C(n+m,n)

再考虑把面积加上进行递推

性质ki+j==ki*kj

重新定义dp[i,j]:走到(i,j)之前所有方案的k矩形个数和

如果我们考虑每次竖着看一列矩形的面积时:

dp[i,j]=dp[i,j-1]×kj+dp[i-1,j]

如果我们考虑每次横着看一排矩形的面积时:

dp[i,j]=dp[i,j-1]+dp[i-1,j]×ki

考虑将两个式子进行合并

dp[i,j-1]×(kj-1)=dp[i-1,j]×(ki-1)

j=j-1(转化为dp[i,j]这样的形式)

dp[i,j]×(kj+1-1)=dp[i-1,j+1]×(ki-1)

同理dp[i-1,j+1]×(kj+2-1)=dp[i-2,j+2]×(ki-1-1)

最后一定会到达终止边界dp[0,i+j]=1

所以dp[i,j]=(ki-1)×(ki-1-1)×....(k1-1)/(kj-1)×(kj+1-1)×.....×(kj+i-1-1)

这样直接线性递推就好

因为只用交答案,慢点也无所谓

posted @ 2019-10-27 22:36  wzx_believer  阅读(115)  评论(0编辑  收藏  举报