
dp
yp_2013
这个作者很懒,什么都没留下…
展开
-
Good BYe 2015 D New Year and Ancient Prophecy
传送门: http://codeforces.com/contest/611/problem/D题意:把一个数字字符串分割成几个严格无前导0的单调递增的序列,问答案mod(1e9+7) 很明显的dp 以下的个人初始想法完全可以忽略掉~~~ 粗略的想法就是:用dp[i]表示以i结尾,且数字以i结束的方法数,那么转移方程就是 如果i到j这段字符串要比以 j结尾的最大字符串大,的话dp[原创 2016-01-16 16:03:32 · 480 阅读 · 1 评论 -
51nod 锁屏密码
http://www.51nod.com/contest/problemSolution.html#!problemId=1374 我们先特判掉n=1的情况,答案很好算,就是2^(m-1)。用数学归纳法证明。当m=1时,只有一种。当m>1时,设当k<m时答案是2^(k-1)成立。那么一种情况是可以由前面m-1个点全部连完了再连最后一个点这儿的方法数是2^(m-2)。还有一种情况是后面m-1个点先原创 2016-02-24 12:29:38 · 896 阅读 · 0 评论 -
Codeforces544C:Writing Code
题意:这题的题意真的是相当难懂,完全没有看懂,而且网上也没有找到题意解释,于是看了看别人的代码,总算知道了这道题是要我们干嘛了。 有n个程序,这n个程序运作产生m行代码,但是每个程序产生的BUG总和不能超过b,给出每个程序产生的代码,每行会产生ai个BUG,问在总BUG不超过b的情况下,我们有几种选择方法 思路:看懂了题意之后就是一个完全背包题了#include <iostream>#incl原创 2016-02-24 23:40:32 · 481 阅读 · 0 评论 -
第三次
D 枚举转化#include<bits/stdc++.h>using namespace std;#define ll long longll a[2][20];ll n;int main(){ scanf("%lld",&n);a[0][0]=1;ll c=n;ll b=0; for(int i=1;i<=n;i++){ scanf("%lld",&a[0原创 2016-03-22 21:30:37 · 260 阅读 · 0 评论 -
CSU 1646: HearthStone
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1646很水的dp,注意第一个牌是对后面的轮数才有效,然后法力值增加的是现在的总共的第一张牌数目,如果2牌并存的那话肯定是先加第一张牌,所以不需要减的情况有两种,1种是有第一种类型的牌,一种是没有打出第二种牌!#include<bits/stdc++.h>using namespace std;in原创 2016-02-28 19:34:36 · 304 阅读 · 0 评论 -
qinghua大乱斗
#include <bits/stdc++.h>using namespace std;using ll = long long;int n;multiset<int> s;void EXEC() { ll ans = 0; scanf("%d", &n); s.clear(); for (int i = 1; i <= n; ++i) { int原创 2016-05-25 11:32:06 · 421 阅读 · 0 评论 -
hdu 5410
写法一 滚动数组+dpdp[c][i][0] 表示花了i元不取当前这种物品,dp[c][i][1] 表示花了i元取过当前这种物品#include<stdio.h>#include<string>#include<map>#include<vector>#include<cmath>#include<stdlib.h>#include<string.h>#include<algorith原创 2016-05-31 19:40:11 · 312 阅读 · 0 评论 -
hdu 5396 Expression
区间dp 调一调出样例就过了#include<bits/stdc++.h>using namespace std;#define ll long longconst ll mod=1e9+7;const int maxn=1e2+10;ll dp[maxn][maxn];int n;int a[maxn];char str[maxn];ll A[maxn];ll c[maxn][ma原创 2016-06-01 10:54:51 · 341 阅读 · 0 评论 -
hdu 5677 ztr loves substring
暴力字符串统计,然后多重背包即可,可以二进制优化。#include <cstdio>#include <cstring>#include <algorithm>#include <cstdlib>#include <cmath>#include <set>#include <map>#include <vector>#include <iostream>#include <queu原创 2016-06-07 23:07:05 · 393 阅读 · 0 评论 -
hdu 5682
注意不能只是判断根节点的minn,maxx值大小,而是要判断所有节点的该值大小,有一个不合法就得返回是0,否则就wrong,也就是中间那句if(!dfs()) 特别重要! 正着反着都要去想一想#include<iostream>#include<cstdio>#include<string.h>#include<vector>#include<algorithm>#include<cma原创 2016-06-08 21:52:04 · 291 阅读 · 0 评论 -
RMQ模板hdu 5452
题意:有一棵生成树,有n个点,给出m-n+1条边,截断一条生成树上的边后,再截断至少多少条边才能使图不连通, 问截断总边数?解题思路: 因为只能在生成树上截断一条边(u, v),所以只需要统计以v为根节点的子生成树里的节点与子生成树外的节点的边数就可以了。对于新加入的边(u’, v’)来说,只影响以LCA(u, v)为根节点的子树里面的节点。统计所有答案,扫一遍输出最小即可 dp值记录的是以原创 2016-06-15 19:58:16 · 404 阅读 · 0 评论 -
hdu 5468 容斥加树形dp
容斥,num统计树中含有因子i的结点有多少个,然后用总结点数减去就可以了,注意now-pre,因为肯定要减,因为当从一个子树到另一个子树的时候,也就是另一个子树的num值还没加进来的时候,num值统计的是全局的,所以要把子树外面的值给减掉~#include<iostream>#include<algorithm>#include<string>#include<map>//int dx[4]=原创 2016-06-17 10:07:43 · 425 阅读 · 0 评论 -
最长上升和下降子序列好题
http://www.myexception.cn/program/1928123.html原创 2016-08-02 10:27:07 · 402 阅读 · 0 评论 -
hdu4628枚举子集状压dp
题目大意: 给一个字符串,每次可以删除一个可不连续回文子串,问最少删几次可以全部删完。思路: 因为字符串长度最大16,所以可用二进制状态表示, 1表示选取这个字符,0不选,组成一个子串。 先预处理出所有状态,看这个状态是不是回文。 f[i]表示状态i最少几次可以全删完, 初始化f数组INF f[i] = min{f[i], f[s]+1 } s是i的子集。 #include<iostrea原创 2016-08-03 11:59:48 · 407 阅读 · 0 评论 -
hdu5787 数位dp
题意是给你一个l,r,问你这中间的数字有几个符合K位数字全都不一样。 这题比较明显的数位dp dp[pos][p1][p2][p3][p4] pos表示当前位,p4表示前一位。这里要考虑前导0的情况,p4=10的时候表示前一位为0. 档(p4==10 && u==0)时表示当前的这位为0并且前四位都为0.所以向下dfs的话 res+=dfs(pos-1,10,10,10,10,flag&&ed原创 2016-08-23 20:41:32 · 264 阅读 · 0 评论 -
whu1608 遍历子集dp
题目大意:给你n个数和s,问最多将n分为多少组,使每组通过加减操作能得到s的组数最多,输出组数#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long lint; int n, s, T, a[20];原创 2017-04-07 10:29:55 · 304 阅读 · 0 评论 -
hdu5787 数位dp
pos表示的是当前处理的是第几位,最低位是0位,abcd表示相邻的四位(一共五位) d是最后一位,就是最远的那位,主要熟悉递归流程,记忆化搜索 #include<stdio.h>#include<iostream>#include<map>#include<math.h>#include<string.h>#include<algorithm>using namespace std;原创 2017-04-08 16:19:52 · 293 阅读 · 0 评论 -
51nod 1405 树的距离之和 (两次dfs,树形dp)
http://www.51nod.com/contest/problem.html#!problemId=1405 数学题,也可以说dp,不太难。 (1)我们给树规定一个根。假设所有节点编号是0-(n-1),我们可以简单地把0当作根,这样下来父子关系就确定了。 (2)定义数组num[x]表示以节点x为根的子树有多少个节点,dp[x]是我们所求的——所有节点到节点x的距离之和。 (3)在步骤(原创 2016-02-23 23:21:52 · 453 阅读 · 0 评论 -
hdu 5550 Game Rooms
其实感觉这个思路也是蛮不错的,至少我这种水平也可以想到, http://www.cnblogs.com/–560/p/5070223.html但是实在是略麻烦,所以还是学习了下面这种同属性区间段整体更新的方法!而且不需要特殊处理全0情况,非常方便~~ http://blog.youkuaiyun.com/snowy_smile/article/details/49618219#include<bits/st原创 2016-03-08 11:40:00 · 695 阅读 · 0 评论 -
Codeforces 607 A Chain Reaction
传送门 http://codeforces.com/problemset/problem/607/A题意: 给出每个怪物的位置和他向左能攻击的范围闭区间(不包括他本身),从右至左激活,现想在最右边加上一个怪物,使得最后死掉的怪物数量最少!!!!!思路: 这种题目很明显的dp嘛,用dp[i]表示第i个位置能存活的最大怪物数量,从左到右扫描一遍,然后过程中更新一下最大值不就 ok了嘛!!!!!原创 2016-01-17 21:16:34 · 744 阅读 · 2 评论 -
hdu 5602 Black Jack
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=5602题意: 21点游戏,A当成1,JQK全部当成10点,轮流叫牌,爆点直接判输,假设牌数特别多,且每个人拿到每张牌的概率是一样的!! 一开始二者都有张牌为输入!问最后闲家胜率大于50%的概率!!!!!! 明显的概率dp,用记忆化搜搜去写嘛!!! 两个dfs分别模拟闲家和庄家叫牌时的情况,终止条件原创 2016-01-18 11:31:17 · 679 阅读 · 1 评论 -
hdu 5593 ZYB's Tree
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=5593题意: 求出树上距离每个点距离不超过k的点数的异或和!!! 树上两个点的距离定义为两个点再树上的最短距离!! 思路: 首先k很小,最大是10,很容易就想到要开一个二维数组,记录到每个点的距离为i的点数有多少个,如果先只算下面的点距上面的点距离为i的点数的话,那么我们就很容易dp了 dp[原创 2016-01-18 23:46:40 · 457 阅读 · 1 评论 -
hdu 5564 Clarke and digits
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=5564 题意: 求长度在l到r之间,能被7整除,且相邻数位和不是k的数的个数?思路: 很明显的dp题目,需要记录的是位数,(数位和)mod7的值,以及最后一位的值。 这样状态转移方程式倒是很好写,但是 1e9*7*10复杂度太高了,所以需要用矩阵快速幂去优化!!!也是蛮好想的,定义A是状态矩阵原创 2016-01-28 21:04:22 · 488 阅读 · 0 评论 -
Codeforces 623 B. Array GCD
传送门: http://codeforces.com/contest/623/problem/B 题意: 有n个数,你可以花费i*a去删除长度i的线段,也可以花费B去让一个数+-1,但是删除操作只能进行一次,+-1对一个数也只能操作一次 并且删除操作不能删除所有的数 问你最小花费多少,可以使得剩下的数的gcd不等于1题解: 很显然,因为不能删除完,所以必然第一个数和最后一个数会剩下来所以原创 2016-02-06 14:04:55 · 426 阅读 · 0 评论 -
hdu 5623 KK's Number
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=5623shit这道题目居然是原题 BZOJ 2091 Poi2010 The Minima Game 动态规划 当时比赛怎么就没注意一下呢,不然又可以多对一道题目了!! 不过这种策略性的dp倒也是第一次见,也想了一段时间才懂这种策略 题目大意:给定n 个数,两个人轮流取,每次可以取走任意一原创 2016-02-07 19:21:20 · 585 阅读 · 0 评论 -
2015湘潭邀请赛 A.Coins
http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1233 题意: n个影币,问有多少种情况至少连续m个正面朝上。 思路: 注意这道题是至少,而不是恰好,理解样例的时候刚开始在这个位置就出现了问题。 dp[i][0]表示满足条件的情况数量dp[i][1]表示不满足条件的情况数量注意在推到的时候有一个状态是i-1-m,这原创 2016-02-15 11:13:40 · 419 阅读 · 0 评论 -
hdu 5543 Pick The Sticks
http://acm.hdu.edu.cn/showproblem.php?pid=5543问桌子上可以放置的木条的最大价值,木条可以放在两边,重心在上面即可,dpjk 表示剩余容量为j,已经用了k个角的最大价值,则01背包即可。#include<bits/stdc++.h>using namespace std;#define ll long longconst int maxn=1e3+1原创 2016-03-02 19:50:44 · 632 阅读 · 0 评论 -
hdu 5542 The Battle of Chibi
题意: 求n个数中长度为m的上升子序列的个数 dpij表示到达i位置,长度为j的方案数目!dp[i][j] = sum( dp[k][j-1], iff a[k] < a[i], 0<=k<i)。树状数组优化dp,对每一个长度都用树状数组记录对应位置的方案数! 这道题主要是让我T的刻骨铭心,好几处位置,一个是%mod,要判断大于了再余!! 一个是m,有可能n很大,m很小,如果每次都把所有的长原创 2016-03-02 21:24:31 · 992 阅读 · 0 评论 -
2015 湘潭邀请赛 Tuples
http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1241很好的一道dp题! 题意:给出n,m,问存在多少种方案,满足a[1] + a[2] + .. + a[m] = n,且a[1] < a[2] < … < a[m] 思路:因次数是递增的,且全是正数,因此m * (m + 1) / 2 <= n,一旦不满足不等式,结果必原创 2016-02-16 00:52:15 · 414 阅读 · 0 评论 -
POJ 3709 K-Anonymous Sequence
斜率优化dp 题意: 将题目转化下:将一个升序的,有N个元素的序列,分组。要求每组的元素不少于K个,计算出组内各元素与最小元素的之差的和,将每组的这个值加起来,其和要最小。很容易可以得出一个结论:连续取比离散取得到的结果要好(很容易证,所以不证)。由以上可得DP方程: dp[i]=MIN(dp[j]+sum[i]-sum[j]-(i-j)*arr[j+1]); j#include<bits/s原创 2016-03-15 17:44:19 · 375 阅读 · 0 评论 -
Codeforces 621 E Wet Shark and Blocks
传送门: http://codeforces.com/problemset/problem/621/E题意:给出n,b,k,x,每个盒子里有n个数,有b个盒子,从每个盒子中随机选出一个数(必选),使得形成的大数modx==k。 b是10的9次幂,这题其实一看就是dp加矩阵快速幂,当时比赛的时候过的人数就比D题多,就感觉肯定是道模型水题,其实之前我的博客里面就有一道类似的题,而且这道题目还比那道题原创 2016-02-03 22:34:29 · 662 阅读 · 0 评论 -
hdu 5617 Jam's maze
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=5617 题意: 500*500的正方形迷宫,每一个格子都有一个字母,从(1,1)走到(N,N)只能右下走,问能走出来多少个回文串,答案要mod上一个数。很明显的dp,一想就知道应该是从两边往中间卡,状态选择就是f[x1][y1][x2][y2]表示的是从1,1到x1,y1 n,n到x2,y2能构成原创 2016-02-04 10:43:36 · 377 阅读 · 0 评论 -
XTU 1206 Dormitory's Elevator
题意:一个电梯只能上升而且不能在连续的2层停止,每个人上和下一层,分别花费体力值为a,b,问满足所需人的需求花费的最小体力值是多少?思路:dp,电梯肯定是停的越多越好,dpi表示的是在第i层停止后使所有顾客都满足的最小花费,那么上一次停止的位置只可能是i-2或者是i-3,然后使得这中间的楼层的人都满足,讨论2*2就ok了!#include<bits/stdc++.h>using namespace原创 2016-03-03 23:36:22 · 341 阅读 · 0 评论 -
hdu 5616 Jam's balance
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=5616 题意: 砝码能拼重量问题,背包,很水,一发就过了,这个是开二维数组的背包,一会按照标解写个一维数组的正反背包!#include<bits/stdc++.h>using namespace std;int a[25],dp[25][2050];int t,n,m,k;void solv原创 2016-02-03 12:37:15 · 387 阅读 · 0 评论 -
Codeforces 8VC Venture Cup
http://codeforces.com/problemset/problem/626/D 预处理出差值,然后组合数学~#include<bits/stdc++.h>using namespace std;#define ll long longconst int maxn=2e3+10;int a[maxn],n;double summ[5500], f[5500];int mai原创 2016-03-16 20:57:47 · 525 阅读 · 0 评论 -
hdu5898数位dp
题意:给出一个区间[l, r],问其中数位中连续的奇数长度为偶数并且连续的偶数长度为奇数的个数。(1<=L<=R<= 9*10^18) 例如 12223333 就不满足条件,因为存在奇数个奇数(1个1)#include<bits/stdc++.h>#define LL long long#define N 100010#define INF 0x3f3f3f3fusing namespac原创 2017-04-09 10:35:06 · 396 阅读 · 0 评论