【总结】一些简单dp题的口胡题解

本文深入探讨了算法竞赛中的关键技巧,包括模意义下最短路径、多重背包优化、循环矩阵快速幂等高级算法,通过具体题目如bzoj2118、HDU2191、广工oj1231等进行实战解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bzoj2118 墨墨的等式
模意义下最短路

CF618F. Double Knapsack
S 1 i , S 2 i S1_i,S2_i S1i,S2i分别表示 a , b a,b a,b的前缀和,设 S 1 n ≤ S 2 n S1_n\leq S2_n S1nS2n
对于每个 S 1 i S1_i S1i,必然能找到一个 j j j,使得 0 ≤ S 2 j − S 1 i &lt; n 0\leq S2_j-S1_i&lt;n 0S2jS1i<n,设为 t o i to_i toi
由于 0 ≤ S 2 t o i − S 1 i &lt; n 0\leq S2_{to_i}-S1_i&lt;n 0S2toiS1i<n 0 ≤ i ≤ n 0\leq i\leq n 0in,取值有 n n n个,个数有 n + 1 n+1 n+1个,根据抽屉原理必然有一段相同的。

HDU2191 单调队列优化多重背包:

 for(i=1;i<=n;i++){
            scanf("%d%d%d",&w,&v,&s);
            if(s>m/w)s=m/w;
            for(d=0;d<w;d++){
                he=ta=1;
                for(j=0;j<=(m-d)/w;j++){
                    int tmp=f[j*w+d]-v*j;
                    while(he<ta&&q[ta-1]<=tmp)--ta;
                    q[ta]=tmp,num[ta++]=j;
                    while(he<ta&&j-num[he]>s)++he;
                    f[j*w+d]=max(f[j*w+d],q[he]+v*j);
                }
            }
        }

广工oj1231 | 51nod 1821 tmk买礼物
a i a_i ai按升序排序,假设前 i i i个数可以凑出 [ 1 , n ] [1,n] [1,n]中所有数,则必须满足 a i + 1 ≤ n + 1 a_{i+1}\leq n+1 ai+1n+1(否则无法凑出 n + 1 n+1 n+1),且此时可以凑出 [ 1 , n + a i ] [1,n+a_i] [1,n+ai]中所有数。

bzoj 1419: Red is good
倒着 d p [ i ] [ j ] dp[i][j] dp[i][j]表示还剩下 i i i张红牌, j j j张黑牌时最优策略下平均能得到的钱数: d p [ i ] [ j ] = m a x ( 0 , i i + j ( d p [ i − 1 ] [ j ] + 1 ) + j i + j ( d p [ i ] [ j − 1 ] − 1 ) ) dp[i][j]=max(0,\frac{i}{i+j}(dp[i-1][j]+1)+\frac{j}{i+j}(dp[i][j-1]-1)) dp[i][j]=max(0,i+ji(dp[i1][j]+1)+i+jj(dp[i][j1]1))

bzoj 3566: [SHOI2014]概率充电器

正难则反,考虑容斥:设 f [ i ] f[i] f[i]表示 i i i点不通电的概率,答案即为 ∑ i = 1 n 1 − f [ i ] \sum\limits_{i=1}^n 1-f[i] i=1n1f[i]
p i p_i pi表示点 i i i直接充电的概率, w i w_i wi表示点 i i i和父亲结点联通的概率。
首先考虑自己不通电加上所有 s o n i son_i soni不同点的概率: f [ i ] = ( 1 − p i ) ∏ j ∈ s o n i ( 1 − ( 1 − f [ j ] ) w j ) f[i]=(1-p_i)\prod\limits_{j\in son_i}(1-(1-f[j])w_j) f[i]=(1pi)jsoni(1(1f[j])wj)
再考虑 i i i的父亲 x x x i i i的贡献,除去 i i i x x x通电的概率 t = 1 − f [ x ] ( 1 − ( 1 − f [ i ] ) w i ) t=1-\frac{f[x]}{(1-(1-f[i])w_i)} t=1(1(1f[i])wi)f[x],则 f [ i ] f[i] f[i]需要再乘上 1 − t w i 1-tw_i 1twi
两遍 d f s dfs dfs即可。

bzoj 2510: 弱题
循环矩阵快速幂 O ( n 2 l o g ) O(n^2log) O(n2log)
矩阵乘法 c [ i + j ] = a [ i ] × b [ j ] c[i+j]=a[i]\times b[j] c[i+j]=a[i]×b[j](循环矩阵乘循环矩阵还是循环矩阵)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值