![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DP
BrooksBUAA
这个作者很懒,什么都没留下…
展开
-
[BZOJ 2253][2010 Beijing wc]纸箱堆叠:CDQ分治|DP
点击这里查看原题首先这是一个严格三维偏序问题,可以用CDQ分治来做,其次这又是一个三维的最长上升子序列问题,dp[i]表示以第i个箱子为结尾的最长长度。 于是我们先将所有箱子按x大小排序,因为要严格上升,因此对于x值相等的情况我们要微调mid的位置,确保x值相等的箱子在一个分治区间内。在每个分治区间内又按y大小排序,对左区间用树状数组维护前缀最大值,对右区间查询前缀最大值。/*User:Smal原创 2017-04-07 08:50:01 · 418 阅读 · 0 评论 -
[BZOJ 4300]绝世好题:DP
点击这里查看原题DP,f[i]表示第i位为1的最优长度/*User:SmallLanguage:C++Problem No.:4300*/#include<bits/stdc++.h>#define ll long long#define inf 999999999using namespace std;int n,dp[35],ans;int main(){ freop原创 2017-04-10 16:53:32 · 313 阅读 · 0 评论 -
[BZOJ 1026][SCOI2009]windy数:DP
点击这里查看原题数位DP,f[i][j]表示以j开头的i位数的个数,cal(x)表示**小于**x的数中符合条件的数的个数,设x=ABCDEFG,长度为len,则答案分为三部分:f[len][i] (1<=i<=A-1),非A开头的len位数的个数f[i][j] (1<=i<=len-1,1<=j<=9),位数小于len的数的个数A开头的数的数的个数注意要用long long,我因为这个WA原创 2017-04-10 19:53:16 · 302 阅读 · 0 评论 -
[BZOJ 1003][ZJOI2006]物流运输:DP+SPFA
点击这里查看原题c[i][j]表示i-j天走同一航线的最小花费,用SPFA处理。 于是得到方程:f[i]=min{f[j]+c[j+1][i]+k},最后结果为f[n]-k。 注意千万不要把n,m打反,我因为把最后结果打为f[m]-k,WA了3次/*User:SmallLanguage:C++Problem No.:1003*/#include<bits/stdc++.h>#defi原创 2017-04-11 11:47:39 · 298 阅读 · 0 评论 -
[BZOJ 1207][HNOI2004]打鼹鼠:DP
点击这里查看原题类似于最长上升子序列,但是只有m^2做法,不过可以使用一个优化,用mx[i]表示前i项中最大的f[i]值,一旦mx[j]+1<=f[i]就break,实测优化前1920ms,优化后60ms。/*User:SmallLanguage:C++Problem No.:1207*/#include<bits/stdc++.h>#define ll long long#defin原创 2017-04-17 21:51:56 · 320 阅读 · 0 评论 -
[BZOJ 1177][Apio2009]Oil:DP
点击这里查看原题s[i][j]表示以(i,j)为右下角的正方形的面积 因为用两条直线可以把矩形分为三个部分且使三个正方形分别在三个矩形内,所以枚举每种分割情况,用分割后每块内的面积最大的正方形的值更新答案 具体分割情况如图: 1.可以通过两条互相垂直的线分成三块,如下图 2.可以通过两条平行的平行的线分成三块,如下图 /*User:SmallLanguage:C++Problem No原创 2017-05-01 16:36:25 · 441 阅读 · 0 评论 -
[BZOJ 4584][Apio2016]赛艇:DP+组合数
点击这里查看原题f[i][j]表示前i个学校中,第i个学校出j个船的方案数,于是f[i][j]=sigma{f[i’][j’]}(i’ < i , j’ < j ) 但是这样会时间空间双LE,因此需要优化。 考虑到n只有500,因此可以对区间进行离散化,把左闭右闭区间换成左闭右开区间,然后f[i][j]表示第i个学校出的船的数量在区间j的方案数。 此时,状态转移分为两个部分: 小于区间j的,原创 2017-05-09 17:52:52 · 387 阅读 · 0 评论 -
[BZOJ 1089][SCOI2003]严格n元树:DP+高精度
点击这里查看原题DP,gig_{i}表示高度小于i的树的个数,gi=∑i−1j=0f(j)g_{i}=\sum_{j=0}^{i-1}f(j), fif_{i}表示高度为i的树的个数。 于是可得fi=∑j=1n(nj)∗fji−1∗gn−ji−1f_{i}=\sum_{j=1}^{n} \binom{n}{j}*f_{i-1}^{j}*g_{i-1}^{n-j}此题需要用到高精度#include原创 2017-06-30 10:34:23 · 457 阅读 · 0 评论