P4707 重返现世(扩展min-max容斥\多项式\动态规划)

这篇博客探讨了如何解决物品组合问题,通过扩展的最小最大容斥原理将其转化为寻找期望次数的问题。作者详细介绍了如何利用背包DP解决这个问题,并提出了在k值较小时的优化策略。通过组合数的巧妙转化,实现了状态转移,降低了复杂度。博客强调了动态规划中的关键要素:状态设计、转移、初始条件和答案求解。
摘要由CSDN通过智能技术生成

P4707 重返现世


在这里插入图片描述
首先对于这种n个物品凑齐k个的问题肯定是扩展minmax容斥了,然后我们就可以把问题转化为min的问题了,然后又是几何级数的老套路直接变为倒数就是期望次数。

k t h − m a x ( S ) = ∑ T ( − 1 ) k − ∣ T ∣ ( ∣ T ∣ − 1 k − 1 ) f ( T ) kth-max(S)=\sum_{T}(-1)^{k-|T|}\binom{|T|-1}{k-1}f(T) kthmax(S)=T(1)kT(k1T1)f(T)

然后我们实际上求解的就是一个背包问题,对于某一个给定的集合大小求解所有的
m ∑ t ∈ T p t \frac{m}{\sum_{t\in{T}}p_t} tTptm
但是我考虑的是使用多项式处理,求解
[ x ∣ T ∣ ] ∏ i = 1 n ( 1 + 1 p i x ) [x^{|T|}]\prod_{i=1}^n(1+\frac{1}{p_i}x) [xT]i=1n(1+pi1x)
这个我们可以使用分治fft求解,但是多项式处理的背包是权值乘积,没法适用于这种更一般的情况,但是对于可以表示为乘积的背包可以大大优化复杂度。

我们对于这个问题就只能够背包dp了,然后容斥系数包含集合大小所以我们很自然的想法应该是 d p i , j , k dp_{i,j,k} dpi,j,k表示前i个原料用了j个,然后 p i pi pi之和为k的方案数。
总的复杂度为 O ( n 2 m ) O(n^2m) O(n2m)

然后考虑优化,这里我们还有k很小这个性质没有利用,然后由于pi之和这一维没法优化,所以我们考虑优化|T|这一维,将这一维去掉,但是这样容斥系数就必须一起处理了,然后对于每次转移时候 ∣ T ∣ |T| T会增加1,我们需要按照套路将组合数拆分,这个时候就恰好转化为了|T|不变但是k会变的转移,由于k是很小的所以我们存储k即可。

这个转移的确是真的很妙,巧妙利用组合数加法公式,将上指标的问题转化到下指标。
在这里插入图片描述
对于动态规划的关键部分有:1. 状态设计 2. 状态转移 3. 初始条件 4. 答案求解
这4步缺一不可。

这道题的初始条件就很耐人寻味,在 d p 0 , 0 , 0 dp_{0,0,0} dp0,0,0的时候1,其他时候为0,这个定义真的比较微妙。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
六自由度机械臂的轨迹规划是指通过给定的起始位置和目标位置,生成从起始位置到目标位置的一条规划路径。其中,“3-5-3”表示分别使用三次多项式、五次多项式和三次多项式来规划六自由度机械臂的运动轨迹。下面是用Matlab编写的六自由度机械臂“3-5-3”次多项式轨迹规划程序: ```matlab % 六自由度机械臂“3-5-3”次多项式轨迹规划 % 定义起始位置和目标位置(关节角度) q_start = [0, 0, 0, 0, 0, 0]; q_target = [pi/2, pi/3, pi/4, pi/6, pi/3, pi/4]; % 定义规划时间和时间间隔 t_start = 0; t_end = 1; dt = 0.01; % 时间间隔 % 计算每个关节的插值多项式系数 q_coeff1 = polyfit([t_start, t_end], [q_start(1), q_target(1)], 3); % 关节1的三次多项式系数 q_coeff2 = polyfit([t_start, t_end], [q_start(2), q_target(2)], 3); % 关节2的三次多项式系数 q_coeff3 = polyfit([t_start, t_end], [q_start(3), q_target(3)], 5); % 关节3的五次多项式系数 q_coeff4 = polyfit([t_start, t_end], [q_start(4), q_target(4)], 5); % 关节4的五次多项式系数 q_coeff5 = polyfit([t_start, t_end], [q_start(5), q_target(5)], 5); % 关节5的五次多项式系数 q_coeff6 = polyfit([t_start, t_end], [q_start(6), q_target(6)], 3); % 关节6的三次多项式系数 % 生成规划路径上的关节角度 t = t_start:dt:t_end; q_path = zeros(length(t), 6); for i = 1:length(t) q_path(i, 1) = polyval(q_coeff1, t(i)); q_path(i, 2) = polyval(q_coeff2, t(i)); q_path(i, 3) = polyval(q_coeff3, t(i)); q_path(i, 4) = polyval(q_coeff4, t(i)); q_path(i, 5) = polyval(q_coeff5, t(i)); q_path(i, 6) = polyval(q_coeff6, t(i)); end % 绘制关节角度随时间变化的图像 figure; plot(t, q_path(:, 1), t, q_path(:, 2), t, q_path(:, 3), t, q_path(:, 4), t, q_path(:, 5), t, q_path(:, 6)); xlabel('时间'); ylabel('关节角度'); legend('关节1', '关节2', '关节3', '关节4', '关节5', '关节6'); % 打印最终的目标关节角度 disp('目标关节角度:'); disp(q_target); ``` 以上程序首先定义了起始位置和目标位置的关节角度向量,然后通过polyfit函数计算出每个关节的插值多项式系数。接下来,根据规划的时间和时间间隔,在梯形速度剖面的基础上使用polyval函数生成规划路径上的关节角度。最后,通过绘图函数plot将关节角度随时间变化的图像显示出来,并打印最终的目标关节角度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值