DP
Saikaai
这个作者很懒,什么都没留下…
展开
-
hdu 2089 & hdu 3555 (数位DP)
题目链接:hdu 2089 hdu 3555这两道虽然是数位dp的水题,但是hdu 3555 我可是调试了很久啊~~~最后才发现是中间变量我开成了int,成功的爆掉了!!!我不是用递推写的,我写的是记忆化搜索,我个人认为记忆化搜索好写且易理解(果然是我太弱了= =)。hdu 2089:#include#include#includeusi原创 2015-03-08 19:46:22 · 405 阅读 · 0 评论 -
POJ 1159 Palindrome
[Description]给你一个字符串,你的任务是找出添加最少的字符得到回文串的方法。如"Ab3bd"有两种方法: "dAb3bAd" 或 "Adb3bdA"[Intput]第一行一个整数N,表示字符串的长度,第二行长度为N的字符串,仅包含大写字母、小写字母和数字。[Output]一行一个数,表示需要添加最少字符数。[Sample Input]5Ab3bd原创 2014-10-21 22:10:12 · 369 阅读 · 0 评论 -
Poj 2096 Collecting Bugs (概率与期望)
题目链接:poj 2096dp[i][j]:descrip in this step we have found i kinds of bugs and these bugs belong to j kinds of system.dp[i][j]=(i/j)*(n*s)*dp[i][j]+(i/j)*(1-j/s)*dp[i][j+1]+(1-i/n)*(j/s)*dp[i+1][j]+原创 2015-03-19 22:04:49 · 550 阅读 · 0 评论 -
BZOJ 3209 花神的数论题 (数位DP)
题目链接:BZOJ 320910000007不是质数。10000007=941*10627。用费马小定理的请注意。组合数1.组合恒等式:C(n,m)= C(n,n-m)= C(n-1,m-1)+C(n-1,m)2.全组合数求和:sigma(c(N,i)) (i->0...N) = 2^N#include#include#includeusing namespace s原创 2015-03-19 22:06:46 · 642 阅读 · 0 评论 -
BZOJ 1875 [SDOI 2009] HH去散步 (DP,矩阵乘法优化)
题目链接:BZOJ 1875这道题的思路,主要是构建矩阵的思路很巧妙。我们普通的用矩阵乘法转移是用点来转移,但是这样不能去掉在一个地方逗留的情况。一个很神奇的做法就是用边来构图(对于一条边i,除去一条边j满足i==(j^1)的情况,与其他的边都相连)转移t-1次,然后同用与起点相连的边构造的一个矩阵(相当于系数矩阵)相乘。最后统计答案,只需将终点相连的边的答案加上即可。#inc原创 2015-03-20 21:26:18 · 1407 阅读 · 1 评论 -
BZOJ 3594 [SCOI 2014] 方伯伯的玉米田 (DP,树状数组优化)
题目链接:BZOJ 3594二维树状数组优化DP。首先写出暴力的动态转移方程:dp[i][j]=max{dp[o][p]}+1.其中满足o然后就是优化问题。对于条件p+a[o]-a[i]其中第一维是j+a[i],第二维是j。但是状态有可能由j=0的转移而来,所以我们将其整体右移一位即可。#include#include#includeusing namespa原创 2015-03-20 21:28:51 · 792 阅读 · 0 评论 -
Poj 3017 Cut the Sequence (DP,单调队列优化,数据结构优化)
题目链接:poj 3017论暴力姿势的优雅性。这道题直接用单调队列的大暴力居然过了,而且跑得很快。正解的话应该是用数据结构维护。时间复杂度为NlogN。先粘一个用单调队列优化的DP#include#include#includeusing namespace std;#define LL long long#define inf (1e18)const int m原创 2015-03-20 21:30:11 · 678 阅读 · 0 评论 -
Poj 3734 Blocks(DP,矩阵乘法优化)
题目链接:poj 3734这道题用矩阵乘法优化DP。考虑到直接转移的话,N太大,会TLE。由于转移的方案数,转移的状态很少,所以可以将转移的方案用矩阵来表示。设dp[i][k]表示涂到第i个格子,状态为k的方案数。其中状态k的定义为:k=1:红色和绿色都为奇数,k=2:红奇绿偶,k=3:红偶绿奇,k=4:红偶绿偶DP方程自己写。表示为矩阵为:2 1 1 01 2 0原创 2015-03-20 21:24:15 · 571 阅读 · 0 评论 -
关于动态规划
不定期更新。概率与期望1.求期望状态设计:始终是当前状态距离最终目标的期望步数,然后倒推即可。2.对于二维的棋盘问题,要增加一位表示已经放了多少个然后进行状态转移。3.对于转移之后又影响初值的问题,用高斯消元解线性方程组即可。数位DP1.思想:逐位思想。 本质:字母数上DP。2.关于记忆化搜索:始终注意加上当前这位是否有限制。用一个数组存放当前的答案以记原创 2015-03-19 22:10:22 · 448 阅读 · 0 评论 -
幸运数字 (数位DP)
没有题目链接,数据网上也没有。粘一下题面。【题目描述】中国人喜欢数字6和8。特别地,一些人喜欢满足含有特定个数6和8的数。现在请求出,在区间[L,R]之间的第K大的含有X个6和Y个8的数。【输入】输入的第一行包括4个数字,L,R,X,Y。接下来的一行给出该组数据的询问数Q。接下来Q行中,每行有一个整数K。【输出】对于某个询问,输出一行,为对应的第K大的数。如果不原创 2015-03-18 17:04:02 · 635 阅读 · 0 评论 -
BZOJ 1833 [ZJOI 2010] 数字统计 (数位DP)
题目链接:BZOJ 1833听说这道是一道水DP(Orz).我到现在都不知道BZOJ上long long要用I64d输出,还是用lld输出Orz。应该是lld吧(DK)。反正我用I64d输出一直PE,改用cout就A了(这个傲娇的评测机= =)。#include#include#includeusing namespace std;#define LL long longL原创 2015-03-18 16:58:36 · 595 阅读 · 0 评论 -
CH round # 65 solve
题目链接:CH round # 65 T1对于每个数考虑每一位的贡献。预处理num[i][0 / 1]数组表示二进制中第i位为0 / 1的数的和。对于求每一位的答案,直接枚举每一位求和即可。时间复杂度为NlogN。我能说这场比赛我们是在飞机上打的吗?那感觉。。。#include#include#includeusing namespace std;const原创 2015-04-11 22:34:47 · 498 阅读 · 0 评论 -
BZOJ 1492 [NOI 2007] 货币兑换Cash (dp + 分治)
题目链接:BZOJ 1492其实这种用单调队列来更新答案的dp可以用平衡树这种鬼畜做法来维护,做到时间复杂度为NlogN,前不久我还写了一道用splay维护的dp题。这道题就是学习一下cdq分治,代码确实比用splay写的要短。#include#include#include#include#includeusing namespace std;const int m原创 2015-04-07 19:59:10 · 515 阅读 · 0 评论 -
hdu 3507(斜率优化)
#include#include#includeusing namespace std;#define maxn (500000+10)int n,m;int q[maxn];int dp[maxn],sum[maxn];int up(int xx,int yy){ return dp[yy]+sum[yy]*sum[yy]-dp[xx]-sum[xx]*sum[xx];}原创 2015-02-05 21:51:19 · 389 阅读 · 0 评论 -
BZOJ 1911 特别行动队(斜率优化dp)
题目链接http://www.lydsy.com/JudgeOnline/problem.php?id=1911#include#include#include#includeusing namespace std;#define maxn (1000000+10)int N,A,B,C;int q[maxn];long long sum[maxn],dp[max原创 2015-02-08 19:45:02 · 436 阅读 · 0 评论 -
hdu 3401 Trade (单调队列优化)
题目链接:trade单调队列优化dp:解决形如dp[i]=max/min (f[k])+g[i] (满足k对于这道题,设dp[i][j]表示在第i天手中有股票数j的最大收益动态转移方程为:dp[i][j]=max(dp[i-w-1][k]-(j-k)*ap[i]); //买入 dp[i][j]=max(dp[i-w-1]原创 2015-03-03 14:29:25 · 407 阅读 · 0 评论 -
双进程动态规划(noip 2008 传纸条,codevs 方格取数)
双进程动态规划。数组的维数为4维,时间复杂度为n^4 转移方程: f[i][j][o][p]=map[i][j]+map[o][p]+max(f[i-1][j][o][p-1],f[i-1][j][o-1][p],f[i][j-1][o][p-1],f[i][j-1][o-1][p])注意判交叉。有两种方法:1.先转移,再判断if(i==o||j==p)f[i][j][o]原创 2014-11-05 16:09:04 · 503 阅读 · 0 评论 -
hdu 1561 the more the better (树形DP)
题目链接:hdu 1561就树上乱搞吧~~~#include#include#includeusing namespace std;#define maxn (210)int w[maxn],head[maxn],fa[maxn],dp[maxn][maxn];struct node{int v,next;}e[100000];inline int read(){ int原创 2015-03-10 14:11:05 · 420 阅读 · 0 评论 -
BZOJ 1010 玩具装箱 (斜率优化DP)
DescriptionP教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京。他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中。P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的。同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形原创 2015-02-07 11:36:35 · 506 阅读 · 0 评论 -
poj 2063 Investment
题目描述:[Description]John得到了一笔巨款,他决定购买债券来进行增值。这种债券每年年底会支付给John固定的年利息,没有固定的期限。债券有大有小,大的通常会有更高的收益,所以John希望找到一个最有的购买方案。此外,每年他的资金都会增长,所有有必要重新计划购买方案。假设有如下两种债券:10000元的本金能够购买2个4000元年的债券,比购买2个3000的好,原创 2014-10-22 22:14:58 · 399 阅读 · 0 评论 -
BZOJ 1090 [SCOI 2003] 字符串折叠 (区间DP)
题目链接:BZOJ 1090dp[i][j]表示区间[i,j]的最短折叠长度转移方程为:dp[i][j]=min(j-i+1,dp[i][k]+dp[k+1][j])特别地若满足区间[k+1,j]可以由区间[i,k]多次折叠得到,那么dp[i][j]=min(dp[i][j],dp[i][k]+2+get((j-k)/(k-i+1)+1))//get函数是求一个数的位数#i原创 2015-03-12 12:43:12 · 470 阅读 · 0 评论 -
BZOJ 1072 [SCOI 2007] 排列perm (状压DP)
题目链接:BZOJ 1072dp[i][j]:i表示每个数选与不选的状态,j表示当前状态的余数#include#include#includeusing namespace std;int a[20],num[20],p[20],dp[1025][1005];int main(){ freopen("test.in","r",stdin); freopen("test原创 2015-03-11 13:48:13 · 413 阅读 · 0 评论 -
BZOJ 1087 [SCOI 2005] 互不侵犯的king (状压DP)
题目链接:BZOJ 1087#include#include#includeusing namespace std;int N,M,cnt=0;int a[550],s[550];long long dp[12][550][500];int find(int x){ int t=1,tot=0; while(t<=x){ if(t&x)tot++; t<<=1;原创 2015-03-11 13:44:25 · 480 阅读 · 0 评论 -
BZOJ 1093 [ZJOI 2007] 最大半连通子图 (tarjan+树形DP)
题目链接:BZOJ 1093tarjan缩点,重新建图,再在图上DP细节:1.重新建图后有重边,需再开一个数组记录是由谁更新得到2.顺着边DP比写记忆化搜索方便3.前后的两个图的边不要搞混#include#include#include#include#includeusing namespace std;#define maxn (100000+10)i原创 2015-03-10 17:47:48 · 471 阅读 · 0 评论 -
BZOJ 2427 [HNOI 2010] 软件安装 (tarjan+树形DP)
题目链接:BZOJ 2427同上一道题。#include#include#include#include#includeusing namespace std;int N,M,idx=0,tot=0;int w[110],v[110],head[110],dfn[110],low[110],vis[110],belong[110];int A[110],B[110],HE原创 2015-03-10 17:52:45 · 564 阅读 · 0 评论 -
BZOJ 1026 windy数 (数位DP)
题目链接:BZOJ 1026我开始是用记忆化搜索写的,然后前导零处理挂了。然后改用数位DP的一般形式写的。写数位DP的一般过程可以总结为先预处理符合条件的没有限制的数,然后将小于限制的直接相加,然后再处理边界上的数(边界处理各种蛋疼)。数位DP的一个重要的思想就是逐位计算。两篇比较好的国家集训队论文:浅谈数位统计类问题 数位计数问题解法研究然后是我的代码:#i原创 2015-03-10 13:45:22 · 423 阅读 · 0 评论 -
hdu 3652 B-number (数位DP)
题目链接:hdu 3652我还是只会用记忆化搜索写= =。#include#include#includeusing namespace std;int limit[100],dp[20][15][5];int dfs(int l,int mod,int now,int fp){ if(!l)return (!mod && now == 2); if(!fp && dp[原创 2015-03-09 20:20:37 · 386 阅读 · 0 评论 -
BZOJ 2298 [HAOI2011]problem a
题目链接:BZOJ 2298这道题,我一开始想的居然是2 - SAT。。。被否决后想一想发现,对于每个人的可能的排名为一个区间,然后我尝试着将区间作为权值来看,说谎的人数就是总人数减去可选的不相交的区间权值和,然后我就不知道怎么统计答案了QAQ。我们可以用dp[i]表示到i节点,选的区间的权值和,转移dp[i] = max(dp[i], dp[j - 1] + i - j)。我们对于每一个原创 2015-04-12 10:20:54 · 473 阅读 · 0 评论