自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Neutralzz的博客

我有自己的梦想和追求!

  • 博客(71)
  • 收藏
  • 关注

原创 HDU 4521 小明系列问题――小明序列 (DP)

这个题解法花样,这里说单纯DP的做法。根据题意很容易想到最长递增子序列,回顾nlogn的二分做法。dp[i]为长度为i+1的子序列的末尾元素的最小值。每加入a[i]时对应的值就是以a[i]结尾的最大长度。假设b[i]为以a[i]结尾的最大长度,dp[]中已经加入了a[0]....a[i-d-1],那么b[i] = lower_bound(dp,dp+maxn,a[i])-dp+1。

2015-07-31 23:18:48 365

原创 POJ 1180 Batch Scheduling (斜率优化DP)

这题看了题解一句话恍然大悟!!!如果从前往后推的话dp方程是有后效性的,但是从后往前考虑第i个对最后结果的贡献,其为处理第i个所用的时间再乘上从第i个开始到最后的f的和。所以设t[i]为从1到i的t的和,f[i]为1到i的f的和方程为dp[i] = min(dp[i],dp[j] + (m+t[j-1]-t[i-1])*(f[n]-f[i-1]))。用斜率优化,注意这个凹折线是从后

2015-07-30 20:26:18 359

原创 UVA 12594 Naming Babies (斜率优化DP)

思路:设dp[i][j] 为将前j个字符分成i段的最小值。a[i]为第i个字符在原始字符串的位置。那么dp[i][j] = min(dp[i][j],dp[i-1][k]+0*a[k+1]+1*a[k+2] + ...... + (j-k+1)*a[j] - a[k+1]^2 - ...... - a[j]^2)原始等价于k*a[k+1]+(k+1)*a[k+2] + ...... + (

2015-07-30 20:07:34 275

原创 POJ 3709 K-Anonymous Sequence (斜率优化DP)

思路:设dp[i]为考虑前i个数字的最小花费。那么dp[i] = min(dp[i],dp[j] + s[j] - s[i] - (j-i)*a[j+1])。注意初值和状态转移的初始位置。我的代码:#include#include#includeusing namespace std;typedef long long LL;const int maxn = 5

2015-07-30 19:45:26 482

原创 POJ 2018 Best Cow Fences (斜率优化入门)

论文题。自行搜索《浅谈数形结合在信息学竞赛中的应用》我的代码:#include#include#include#includeusing namespace std;typedef long long LL;const int maxn = 100005;LL n,m,a[maxn],s[maxn];LL q[maxn],hd,tl;LL getY(LL j

2015-07-30 19:41:19 537

原创 POJ 1160 Post Office (水DP)

思路:设dp[i][j]为前j个地方放i个邮局且第i个放在地方j上的最小距离和。那么dp[i][j] = min(dp[i][j],dp[i-1][k] +w(k,j)) (w(k,j)为区间k到j的最小距离和)这里可以用四边形不等式优化。我的代码:#include#include#include#includeusing namespace std;const

2015-07-30 19:39:14 274

原创 HDU 3516 Tree Construction (dp+四边形不等式优化)

这题是个区间DP。。当时根本没想到。。。设dp[i][j]为将区间i到j内的所有节点连接的最短边权和。那么这棵树肯定是有两子树构成。方程便为:dp[i][j] = min(dp[i][j],dp[i][k] + dp[k+1][j] + dis(i,j))。然后用四边形不等式。我的代码:#include#include#include#include#inclu

2015-07-30 11:45:24 548

原创 HDU 3045 Picnic Cows (斜率优化DP)

思路:设dp[i]为考虑前i个cows的最小值。s[i] 为从第1个到第i个的moos和。那么方程为dp[i] = min(dp[i],dp[j] + s[i] - s[j] - (i - j)*a[j+1])。然后斜率优化将复杂度降为O(n)。这个题!!!一定要注意初值!!!一定要注意状态从什么地方开始转移!!!以后的所有DP题也是!!!我的代码:#inclu

2015-07-30 11:39:04 280

原创 HDU 3669 Cross the Wall (斜率优化DP)

先将各矩形按照w从小到大排序。设dp[i]为考虑前i个矩形的总的最小面积。dp[i] = min(dp[i], dp[j] + h[k]*w[i]) k为从j+1到i的高度最大的矩形。那么这样复杂度n^3必然T。考虑这样一个事实:将矩形排序后,考虑第i个矩形,前i-1个矩形中高度比它小的必然可以被包含于第i个矩形,我们只需要考虑排序后矩形中高度降序的矩形。那么方程就变为dp[i

2015-07-30 11:30:47 256

原创 HDU 2993 MAX Average Problem (斜率优化)

论文上的题,不懂自行搜索周源论文《浅谈数形结合思想在信息学竞赛中的应用》这个题单独scanf读数据就超时,已经没法AC了,自己会了就行。代码:#include#include#include#include#includeusing namespace std;const int MAXN=100010;double sum[MAXN];int a[MAXN];

2015-07-30 10:51:04 224

原创 HDU 1300 POJ 1260 Pearls (DP)

思路:设dp[i]为考虑前i个珍珠的最小花费。那么枚举用第i个珍珠所代替的珍珠(其所替换的必定是一段连续的区间)得到方程dp[i] = min(dp[i],dp[j] + cost(j+1,i))。这个题可以用斜率优化来降低复杂度。我的代码:#include#include#includeusing namespace std;const int maxn = 5

2015-07-30 10:46:19 291

原创 HDU 4528 小明系列故事――捉迷藏 (很好的BFS)

在用BFS的时候可访问的点要用四个状态去记录,0代表一个都没找到,1代表找到了大明,2代表找到了二明,3代表都找到。因为在BFS的过程中访问各节点时,因为访问时的状态不同,所以过程中包含有回路。我的代码:#include#include#include#includeusing namespace std;const int maxn = 105;struct

2015-07-30 10:39:29 682

原创 HDU 2829 Lawrence (斜率优化DP)

题意:炸铁路,每段连通的铁路的价值为两个直接或间接相连的点对的权值积的和,求炸m次的最小总价值。思路:设dp[i][j]为炸i次,考虑前j个站点的总价值。那么方程为dp[i][j] = min(dp[i][j],dp[i-1][k] + val(k+1,j))。val(k+1,j)的值为k+1到j的各项权值的 和的平方 减去 平方的和 后再除以2。然后就可以写出斜率形式。

2015-07-30 10:33:17 277

原创 HDU 3507 Print Article (斜率优化DP)

题意:一篇文章打印成多行,每行可以有任意数目个字符,打印成一行的代价为sigma(ci)^2+m,求总的最小代价。思路:设dp[i]为考虑前i个字符的最小代价,s[i]为从第1个字符到第i个字符的代价和。那么枚举与第i个字符同行的字符个数得方程:dp[i] = min(dp[i] , dp[j] + (s[i] - s[j])^2 + m)。然后斜率优化复杂度降到O(n)。斜率DP

2015-07-30 10:23:26 300

原创 HDU 5294 Tricks Device (最短路变体) 2015多校联合第一场

第二个答案很好求,求出最短路进过的最少的边数 和总数作差就是了。关键是第一问,我的做法是记录最短路的所有路径,然后从终点出发,开始搜索,经过的边进行标记,标记了的边不能再访问,如果能到达起点,结果+1。我的代码:#include#include#include#include#include#includeusing namespace std;typedef

2015-07-23 19:20:24 302

原创 HDU 5305 Friends (搜索+剪枝) 2015多校联合第二场

开始对点搜索,直接写乱了,想了想对边搜索,虽然复杂度高,剪枝一下水过去了。代码:#include#include#include#includeusing namespace std;struct Edge{ int a,b;}G[35];int n,m,deg[10],on[10],off[10];int res;void init(){ mem

2015-07-23 19:11:46 510

原创 HDU 5303 Delicious Apples (DP) 2015多校联合第二场

题意:一个环上有n个苹果树,每个树上有ai个苹果,你有一个容量为k的篮子,装满苹果后要回到起点清空篮子,问你从起点出发,摘完所有苹果所走的最短路程。思路:最后的结果肯定是顺时针取一定的苹果所走的最短路与逆时针走的最短路的和。那么设dp[2][i],0代表顺时针,1代表逆时针,i代表取的苹果数,值为取完i个苹果回到原点的最短路程。position[i]为第i个苹果所在的位置。以顺时针为例

2015-07-23 19:08:09 946

原创 SPOJ BALNUM (数位DP+状压)

用两个状态S,KS中第i位为1,说明出现了奇数次,为0说明出现偶数次。K中第i位为1,说明数字i出现过,为0说明没出现。复杂度10的7次方。。。120ms跑过。。。正解应该是用三进制把两个状态合并。我的代码:#include#include#include#includeusing namespace std;typedef unsigned l

2015-07-22 16:16:17 300

原创 HDU 3652 B-number (简单数位DP)

dp[i][s][k] k为模13的余数。s=0,不存在;s=1,不存在,上一位为1;s=2,存在。我的代码:#include#include#include#includeusing namespace std;int n,dp[12][15][3];int bit[12],top;int get_newk(int k,int d){ if

2015-07-22 16:09:48 316

原创 HDU 3709 Balanced Number (简单数位DP)

枚举中间位置,注意前导0。我的代码:#include#include#include#include#include#includeusing namespace std;typedef long long LL;LL dp[20][20][2000],l,r;LL bit[20],top;LL dfs(LL i,LL k,LL s,bool e,bool z){

2015-07-22 15:54:45 229

原创 POJ 3252 Round Numbers (简单数位DP)

记录0和1的个数就好代码:#include#include#include#includeusing namespace std;typedef __int64 LL;LL dp[50][50][50],l,r;LL bit[50],top;LL dfs(int i,int s,int k,bool e,bool z){ if(i == -1) return

2015-07-22 15:50:24 208

原创 HDU 3555 Bomb (简单数位DP)

同上,dp[i][0] 不存在,dp[i][1] 不存在,且上一位为4,dp[i][2] 存在代码:#include#include#include#includeusing namespace std;typedef __int64 LL;LL dp[20][3],l,r;LL bit[20],top;int get_news(int s,int d){

2015-07-22 15:47:01 202

原创 HDU 2089 不要62 (简单数位DP)

dp[i][0] 不存在dp[i][1]不存在,上一位为6dp[i][2] 存在代码:#include#include#include#includeusing namespace std;typedef __int64 LL;LL dp[20][3],l,r;LL bit[20],top;int get_news(int s,int d){

2015-07-22 15:42:22 218

原创 HDU 4352 XHXJ's LIS (数位DP+状态压缩)

最长递增子序列很自然就想到二分(nlogn)的算法,用状态S存储二分后的答案,第i位为1就是i存在于二分的答案中。注意前导0。我的代码:#include#include#include#includeusing namespace std;typedef __int64 LL;const int inf = 0x3f3f3f3f;LL dp[20][1<<10][11

2015-07-22 15:38:47 264

原创 CodeForces 55D Beautiful numbers (数位DP)

题意:一个数字,如果它能被所有的非零数字整除,就为 Beautiful numbers。参考题解:点击打开链接dp[位数][高位数字模2520的余数][最小公倍数]AC代码:#include#include#include#includeusing namespace std;typedef __int64 LL;LL c[2550],g[2550][10]

2015-07-22 15:27:53 332

原创 HDU 4734 F(x) (数位DP)

题意:我们定义十进制数x的权值为f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2)+...a(2)*2+a(1)*1,a(i)表示十进制数x中第i位的数字。题目给出a,b,求出[0,b]有多少个不大于f(a)的数。我理解的数位DP就是通过按位记忆化搜索找出所有满足条件的小于等于n的数。然后对于第i位,状态s是由其高位确定的。数位DP的题目一般都很明显,关键在于状态的设计。看

2015-07-21 23:00:40 255

原创 POJ 3140 Contestants Division (水题)

思路:记录每个节点的子节点的总和和非子节点的总和的差的绝对值,再扫一遍就完了。水题。。。和树形DP没关系。。。代码:#include#include#include#include#define abs(x) ((x) >= 0 ? (x) : -(x))using namespace std;typedef __int64 LL;const LL maxn = 1000

2015-07-19 12:00:05 267

原创 POJ 3107 Godfather (水题,树形DP)

思路:设dp[i]为在i的子树中,删去i后的最大连通子图的顶点个数。dp[u] = max(dp[u],num[v])。代码:#include#include#include#includeusing namespace std;const int maxn = 50005;const int INF = 1e6+5;struct Nod{ int b

2015-07-19 11:53:15 284

原创 HDU 3586 Information Disturbing (树形DP+二分)

思路:二分上限,求出删去一些满足条件的边后使根节点和所有叶节点不相连的最小花费。设dp[i]为在i为根节点的子树中使i节点与叶节点分离的最小花费。父节点为u,子节点为v,边权为cost。初值:叶节点值为INF。如果cost反之,dp[u] += dp[v]。代码:#include#include#include#includeusing namespa

2015-07-19 11:39:28 243

原创 ZOJ 3627 Treasure Hunt II (贪心)

水题,不过细节坑死,WA了很多发。。。思路:先从起点不断往两侧走,左端边界lb为max(1LL,p-t),右端边界为min(n,p+t)。如果rb-lb 反之,如果M是偶数,就让两个人从起点分别走M/2步,往后就是先向左再向右还是先向右再向左的问题,枚举就好了。如果M是奇数,两个人中其中一人要走M/2+1步,同样枚举即可。代码:#include#inclu

2015-07-19 11:07:56 315

原创 HDU 1561 The more, The Better (树形DP+背包)

思路:设dp[i][j]为在以i为根节点的子树中在i节点处还可以访问j个节点的最大收益。那么初始状态:j>=1时,dp[i][j] = val[i]dp[u][j] = max(dp[u][j],dp[u][j-k]+dp[v][k])需要注意的是,要想访问v节点,u节点必须被攻克,所以k的范围是1到j-1。代码: #include #include #incl

2015-07-19 10:52:31 245

原创 HDU 1011 Starship Troopers (树形DP+背包)

思路:设dp[i][j]为以i为根节点的子树中在i点还有j个troopers的最大收益。初值需要注意,dp[i][0]必须为0,因为你要获得i中的brain必须要放至少一个trooper。在循环中让k从1开始取可以达到同样的效果。转移方程:dp[u][j] = max(dp[u][j],dp[u][j-k]+dp[v][k]);代码:/* * dp[u][j] = m

2015-07-19 10:42:49 243

原创 POJ 1947 Rebuilding Roads (树形DP)

思路:设dp[i][j]为以i为根节点的子树中,形成j个节点(包含i)的子树需要切断的最少路数。那么初值dp[i][0] = 1,dp[i][1] = 0;dp[u][j] = min(dp[u][j-k]+dp[v][k],dp[u][j])。代码:#include#include#includeusing namespace std;const int max

2015-07-19 10:28:44 179

原创 POJ 1155 TELE (树形DP+背包)

思路:设dp[i][j]为在以i为根节点的子树中,连接j个用户的最大收益。u为父节点,v为子节点,那么dp[u][j] = max(dp[u][j],dp[u][j-k]+dp[v][k]+cost)。实现过程注意加上break,不然容易T。。。代码:#include#include#include#includeusing namespace std;co

2015-07-19 10:17:51 267

原创 CodeForces 219D Choosing Capital for Treeland (树形DP)

思路:dp[i]为在以i为根节点的子树中i到各点的需要反向的路的数目。那么dp[u] = sigma(dp[v] + i) 如果(u,v)是反向边,i=1;反之为0。这样求出的dp[u]为u到其子树各点的反向边的数目。在做一遍dfs,使dp[v] = dp[u] + i 如果(u,v)是反向边 ,i=-1;反之,i=1。代码:#include#include#inc

2015-07-19 10:01:50 354

原创 POJ 3162 Walking Race (树形DP)

这个题的关键点在于怎么求出上下界思路:先像上一篇一样求出每个点到达的最大距离,用mlen[]记录下来。然后用multiset去维护区间的最大值和最小值,因为multiset是升序的。复杂度O(nlogn)我的代码:#include#include#include#include#includeusing namespace std;const int ma

2015-07-17 13:03:04 240

转载 HDU 2196 Computer (经典树形DP)

本文出自点击打开链接本人代码:#include#include#include#includeusing namespace std;const int maxn = 100005;struct Nod{ int b,val,next; void init(int b,int val,int next){ this->b = b;this->

2015-07-17 08:49:04 268

原创 HDU 2196 Anniversary party (树形DP 水题)

题意:一个森林,每个节点都有一个值,每个节点和他的父节点不能同时出现,求出现的节点的值的和的最大值。思路:dp[i][j] 为以i为根节点的树的最大值的和,j = 0说明根节点存在,j =1说明不存在。我的代码:#include#include#include#includeusing namespace std;const int maxn = 6005;int n,

2015-07-16 22:29:07 237

原创 HDU 4745 Two Rabbits (区间DP)

题意:n个石头排成一个环,每个环有自己的重量,两只兔子从两个石头上出发,每一轮从一个石头跳到另一个石头,一个顺时针,一个逆时针,并且同一时间两只兔子所在的石头重量相等。每只兔子不能跳到并且跳过自己曾在的石头。问最多进行多少轮。思路:把n个石头排成一排,再取n个石头和前n个石头一样,成2n个石头。比如说1121变成11211121然后把这2*n个石头排成一个环,求这个环内的最长回文子串的

2015-07-16 18:33:47 248

原创 HDU 4632 Palindrome subsequence(区间DP 回文子串的个数)

题意略。思路:设dp[i][j] 为i到j内回文子串的个数。那么状态转移方程为dp[i][j] = dp[i][j-1] + dp[i+1][j] - dp[i+1][j-1]如果a[i] = a[j] ,dp[i][j] += (dp[i+1][j-1] + 1)。我的代码:#include#include#includeusing namespace std

2015-07-16 18:06:43 1870

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除