【BUCTOJ】问题H:Harnack函数(动态规划)

文章介绍了如何使用动态规划方法解决H(n,m)问题,通过分析最优子结构和边界条件确定了动态规划的递推公式,并提出了初始值从H(0,-1)或H(-1,0)开始为0的推论。进一步,文章提出并证明了一个更快的解决方案:H(n,m)=((n-1)*n+(m-1)*m)/2,最后给出了C++代码实现。

在这里插入图片描述

样例输入

4 3

样例输出

9

提示

样例输入2 复制

13 13

样例输出2 复制

156

这题用动态规划做。

首先审题,发现如果要求H(n,m),需要从1向上迭代出,符合动态规划题型.dp方程也已经给出,最优子结构为H(n-1,m)+n-1和H(n,m-1)+m-1.那么还剩下枚举确定边界就可以做出该题.

枚举其实也不难。因为我们看到,H(n,m)每次向上迭代都是以H(n或m原数+1,m或n)得出.换言之,从H(n,m)向下迭代是n或m递减的,n或m必有一个数率先达到-1,获取函数的初值。

假设获取初值时函数为H(-1,k)(k>=0),那么向上迭代一次,为H(0,k)=max(H(-1,k)-1,H(0,k-1)+k-1)(1)

如果k=0,前后相等等于0.

如果k>0,那么前者为0,后者需要讨论H(0,k-1)的大小.

对于H(0,k-1)=max(H(-1,k-1)-1,H(0,k-2)+k-2)(2),

假设k=1,那么(2)式前后值相等都等于0,(1)式前后相等都等于0。

假设k=2,那么(2)式需要继续讨论H(0,k-2)的大小,最后回带到(1)式,后者更大等于1。

假设k无限大,那么(2)式需要不断向下迭代,发现k必须减至0才能终止迭代.

通过以上操作,我们可以得出推论:初始值必须从H(0,-1)或H(-1,0)开始取,而这个值就是0.同样,H(0,0)=0.
     &

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

城主_全栈开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值