欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-14 16:03:39
...

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

CF618F. Double Knapsack
S1i,S2iS1_i,S2_i分别表示a,ba,b的前缀和,设S1nS2nS1_n\leq S2_n
对于每个S1iS1_i,必然能找到一个jj,使得0S2jS1i<n0\leq S2_j-S1_i<n,设为toito_i
由于0S2toiS1i<n0\leq S2_{to_i}-S1_i<n0in0\leq i\leq n,取值有nn个,个数有n+1n+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买礼物
aia_i按升序排序,假设前ii个数可以凑出[1,n][1,n]中所有数,则必须满足ai+1n+1a_{i+1}\leq n+1(否则无法凑出n+1n+1),且此时可以凑出[1,n+ai][1,n+a_i]中所有数。

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

bzoj 3566: [SHOI2014]概率充电器

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

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