ACM DP作业整理 待补

 

https://vjudge.net/contest/341779#overview

难度中等

题解:

A:

二进制拆分 + 01背包;

n可以拆分为 1、2、4 …… 2 ^ (k - 1)、n - 2 ^ k + 1

m = 100000,复杂度是 mnlogn,不知道为啥能过……

B:

完全背包,滚动数组优化;

C:

01背包;

D:

一个包装的01背包问题,将钱数看作价值,被捕的概率看作体积,但是注意概率不能靠加减法计算,而是乘除法;

考虑到数组下标不能是小数,所以让下标变成价值,那么从大到小遍历所有可能的价值,第一个体积小于总体积的价值就是答案;

用滚动数组优化;

定义dp[i] : 表示 抢劫 i 价值的财物被捕的最小概率;

dp[0] = 0,dp[i] = INF;

转移:dp[j] = min(dp[j],dp[j - w[i]] * (1.0 - v[i]) + (1.0 - dp[j - w[i]]) * v[i] + dp[j - w[i]] * v[i]);

但是这样实在是太长了,考虑换一种状态;

dp[i] : 表示 抢劫 i 价值的财物逍遥法外的最大概率;

dp[0] = 1,dp[i] = 0;

转移 :dp[j] = max(dp[j],dp[j - w[i]] * (1.0 - v[i]));

注意不要漏掉状态(加粗部分),找出状态的所有情况是关键点

E:

证明你学过动态规划;

F:

在另一篇博文里讲的很清楚了;

https://blog.csdn.net/Loi_gold/article/details/103192107

G:

证明你学过动态规划;

H:

不难,但还是想了很长时间,首先要优化状态,让差的平方最小,则考虑到排序;

可以证明,排序后,当且仅当某数和前面一个数或者它后面一个数成对时,总的和最小;

因为 对于4个数,差是a,b,c。(a + b)^ 2 <= (a + c) ^ 2 + (b + c) ^ 2 和 (a + b + c) ^ 2 + b ^ 2;

dp[i][j] : 前i个数选2 * j个数字D的最小值;

dp[i][j] = min( dp[i - 1][j],dp[i - 2][j - 1] + (a[i] - a[i - 1]) * (a[i] - a[i - 1]) ); 

注意初始化dp[i][0] 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值