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]