DP
Saikaai
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
hdu 2089 & hdu 3555 (数位DP)
题目链接:hdu 2089 hdu 3555 这两道虽然是数位dp的水题,但是hdu 3555 我可是调试了很久啊~~~最后才发现是中间变量我开成了int,成功的爆掉了!!!我不是用递推写的,我写的是记忆化搜索,我个人认为记忆化搜索好写且易理解(果然是我太弱了= =)。 hdu 2089: #include #include #include usi原创 2015-03-08 19:46:22 · 462 阅读 · 0 评论 -
POJ 1159 Palindrome
[Description] 给你一个字符串,你的任务是找出添加最少的字符得到回文串的方法。如"Ab3bd"有两种方法 : "dAb3bAd" 或 "Adb3bdA" [Intput] 第一行一个整数N,表示字符串的长度,第二行长度为N的字符串,仅包含大写字母、小写字 母和数字。 [Output] 一行一个数,表示需要添加最少字符数。 [Sample Input] 5 Ab3bd原创 2014-10-21 22:10:12 · 411 阅读 · 0 评论 -
Poj 2096 Collecting Bugs (概率与期望)
题目链接:poj 2096 dp[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 · 610 阅读 · 0 评论 -
BZOJ 3209 花神的数论题 (数位DP)
题目链接:BZOJ 3209 10000007不是质数。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 #include using namespace s原创 2015-03-19 22:06:46 · 742 阅读 · 0 评论 -
BZOJ 1875 [SDOI 2009] HH去散步 (DP,矩阵乘法优化)
题目链接:BZOJ 1875 这道题的思路,主要是构建矩阵的思路很巧妙。我们普通的用矩阵乘法转移是用点来转移,但是这样不能去掉在一个地方逗留的情况。 一个很神奇的做法就是用边来构图(对于一条边i,除去一条边j满足i==(j^1)的情况,与其他的边都相连)转移t-1次, 然后同用与起点相连的边构造的一个矩阵(相当于系数矩阵)相乘。最后统计答案,只需将终点相连的边的答案加上即可。 #inc原创 2015-03-20 21:26:18 · 1497 阅读 · 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 #include using namespa原创 2015-03-20 21:28:51 · 880 阅读 · 0 评论 -
Poj 3017 Cut the Sequence (DP,单调队列优化,数据结构优化)
题目链接:poj 3017 论暴力姿势的优雅性。 这道题直接用单调队列的大暴力居然过了,而且跑得很快。正解的话应该是用数据结构维护。时间复杂度为NlogN。 先粘一个用单调队列优化的DP #include #include #include using namespace std; #define LL long long #define inf (1e18) const int m原创 2015-03-20 21:30:11 · 761 阅读 · 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 0 1 2 0原创 2015-03-20 21:24:15 · 646 阅读 · 0 评论 -
关于动态规划
不定期更新。 概率与期望 1.求期望状态设计:始终是当前状态距离最终目标的期望步数,然后倒推即可。 2.对于二维的棋盘问题,要增加一位表示已经放了多少个然后进行状态转移。 3.对于转移之后又影响初值的问题,用高斯消元解线性方程组即可。 数位DP 1.思想:逐位思想。 本质:字母数上DP。 2.关于记忆化搜索:始终注意加上当前这位是否有限制。用一个数组存放当前的答案以记原创 2015-03-19 22:10:22 · 558 阅读 · 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 · 779 阅读 · 0 评论 -
BZOJ 1833 [ZJOI 2010] 数字统计 (数位DP)
题目链接:BZOJ 1833 听说这道是一道水DP(Orz). 我到现在都不知道BZOJ上long long要用I64d输出,还是用lld输出Orz。应该是lld吧(DK)。反正我用I64d输出一直PE,改用cout就A了(这个傲娇的评测机= =)。 #include #include #include using namespace std; #define LL long long L原创 2015-03-18 16:58:36 · 667 阅读 · 0 评论 -
CH round # 65 solve
题目链接:CH round # 65 T1 对于每个数考虑每一位的贡献。预处理num[i][0 / 1]数组表示二进制中第i位为0 / 1的数的和。对于求每一位的答案,直接枚举每一位求和即可。时间复杂度为NlogN。 我能说这场比赛我们是在飞机上打的吗?那感觉。。。 #include #include #include using namespace std; const原创 2015-04-11 22:34:47 · 555 阅读 · 0 评论 -
BZOJ 1492 [NOI 2007] 货币兑换Cash (dp + 分治)
题目链接:BZOJ 1492 其实这种用单调队列来更新答案的dp可以用平衡树这种鬼畜做法来维护,做到时间复杂度为NlogN,前不久我还写了一道用splay维护的dp题。这道题就是学习一下cdq分治,代码确实比用splay写的要短。 #include #include #include #include #include using namespace std; const int m原创 2015-04-07 19:59:10 · 588 阅读 · 0 评论 -
hdu 3507(斜率优化)
#include #include #include using 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 · 443 阅读 · 0 评论 -
BZOJ 1911 特别行动队(斜率优化dp)
题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=1911 #include #include #include #include using 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 · 484 阅读 · 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 · 453 阅读 · 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 · 553 阅读 · 0 评论 -
hdu 1561 the more the better (树形DP)
题目链接:hdu 1561 就树上乱搞吧~~~ #include #include #include using 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 · 480 阅读 · 0 评论 -
BZOJ 1010 玩具装箱 (斜率优化DP)
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京。他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中。P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的。同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形原创 2015-02-07 11:36:35 · 560 阅读 · 0 评论 -
poj 2063 Investment
题目描述: [Description] John得到了一笔巨款,他决定购买债券来进行增值。这种债券每年年底会支付给John固定的年 利息,没有固定的期限。债券有大有小,大的通常会有更高的收益,所以John希望找到一个最 有的购买方案。此外,每年他的资金都会增长,所有有必要重新计划购买方案。假设有如下两 种债券: 10000元的本金能够购买2个4000元年的债券,比购买2个3000的好,原创 2014-10-22 22:14:58 · 443 阅读 · 0 评论 -
BZOJ 1090 [SCOI 2003] 字符串折叠 (区间DP)
题目链接:BZOJ 1090 dp[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 · 532 阅读 · 0 评论 -
BZOJ 1072 [SCOI 2007] 排列perm (状压DP)
题目链接:BZOJ 1072 dp[i][j]:i表示每个数选与不选的状态,j表示当前状态的余数 #include #include #include using 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 · 464 阅读 · 0 评论 -
BZOJ 1087 [SCOI 2005] 互不侵犯的king (状压DP)
题目链接:BZOJ 1087 #include #include #include using 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 · 523 阅读 · 0 评论 -
BZOJ 1093 [ZJOI 2007] 最大半连通子图 (tarjan+树形DP)
题目链接:BZOJ 1093 tarjan缩点,重新建图,再在图上DP 细节: 1.重新建图后有重边,需再开一个数组记录是由谁更新得到 2.顺着边DP比写记忆化搜索方便 3.前后的两个图的边不要搞混 #include #include #include #include #include using namespace std; #define maxn (100000+10) i原创 2015-03-10 17:47:48 · 525 阅读 · 0 评论 -
BZOJ 2427 [HNOI 2010] 软件安装 (tarjan+树形DP)
题目链接:BZOJ 2427 同上一道题。 #include #include #include #include #include using 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 · 611 阅读 · 0 评论 -
BZOJ 1026 windy数 (数位DP)
题目链接:BZOJ 1026 我开始是用记忆化搜索写的,然后前导零处理挂了。然后改用数位DP的一般形式写的。写数位DP的一般过程可以总结为先预处理符合条件的没有限制的数,然后将小于限制的直接相加,然后再处理边界上的数(边界处理各种蛋疼)。数位DP的一个重要的思想就是逐位计算。 两篇比较好的国家集训队论文:浅谈数位统计类问题 数位计数问题解法研究 然后是我的代码: #i原创 2015-03-10 13:45:22 · 470 阅读 · 0 评论 -
hdu 3652 B-number (数位DP)
题目链接:hdu 3652 我还是只会用记忆化搜索写= =。 #include #include #include using 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 · 441 阅读 · 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 · 542 阅读 · 0 评论
分享