hdu 6024

hdu 6024

一道比较有意思的动态规划题目。答案见大佬博客。在写状态转移方程的时候, dp[i][1] = min(dp[i-1][0],dp[i-1][1]) + ci 很容易得到,就是第i个教室开店的最小费用是由上一个店开不开店的最小费用转移过来的。但如何写出这个教室不开店的最小费用呢? 也就是 dp[i][0] 怎么写呢?普通的求解会tle,网上有人用

 for(int j=i-1;j>=0;j--)
            {
                t += (i - j) * (nodes[j+1].x - nodes[j].x);
                dp[i][0] = min(dp[i][0],dp[j][1] + t);
            }
        }

来计算dp[i][0] ,但没有解释,但模拟一下数据还是能看出来。 实际就是 j 遍历i-1到0店铺,假设i最近的左边开店的是第 j 个店铺,计算出从 j 到 i 的距离费用。是逆向遍历。而且 t 要加上从 j到 [j+1,i] 店铺的所有距离费用,这中间同一间隔就计算了多次。例如 1-2-3-4,只有1开店,现计算4不开店的费用,就要加上2和3和4到1的距离,1到2这段距离被计算了3次,也就是公式中的(4-1)*(nodes[4].x-nodes[1].x);2到3这段距离计算了2次,就是(4-2)x(nodes[4].x-nodes[2].x)。
也就是如图: 是不是一下子就看出来了…不过怎么想了近半小时理解。。还是先思考一下比较好,不然就比较被动。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值