自定义博客皮肤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的博客

我有自己的梦想和追求!

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

原创 Codeforces 665E Beautiful Subarrays (Trie树)

题意:找出异或和>=k的连续子序列个数。官方题解:http://codeforces.com/blog/entry/44466[code]:#include#includeusing namespace std;typedef long long LL;const int maxn = 1e6+5;const int ML = 30;struct Nod{ in

2016-05-04 15:36:10 294

原创 LightOJ 1352 Strange Summation(找规律or数位DP)

解析:将[l,r]的所有二进制数字左对齐后做不进位的加法运算后的值(注意是不进位!写一下找找规律就好。[code]:#include#includeusing namespace std;typedef unsigned long long LL;LL num[70];int top;void sol(LL n,int p){//printf("-> %llu

2016-04-24 23:20:13 596

原创 LightOJ 1364 Expected Cards (概率DP)

解析:设dp[c][d][h][s][i][j]为有c,d,h,s个对应的牌,i、j记录大小王的状态。记忆化搜索一下就ok[code]:#include#include#includeusing namespace std;int C,D,H,S,cnt[5];double dp[15][15][15][15][5][5];void init(){ int

2016-04-24 21:31:38 1010

原创 Light OJ 1394 Disable the Wand (数位DP)

解析:dp值设为pair  同时记录个数和sum,套模板。[code]:#include#include#include#includeusing namespace std;typedef long long LL;typedef pair PLL;PLL dp[35][35][35][3][7];int s1,s2,ideal[32];int bit[35],to

2016-04-23 21:29:35 411

原创 Light OJ 1415 Save the Trees (dp+块状数组)

解析:设dp[i]为考虑前i棵树的最小收益。那么dp[i] = min(dp[j]+max(h[j+1...i]));显然不能直接状态转移,但是又想不出logn的做法,于是就套上了块状数组。[code]:#include#include#include#include#includeusing namespace std;typedef long long L

2016-04-23 10:46:09 502

原创 Light OJ 1342 - Aladdin and the Magical Sticks (概率DP)

解析:设dp[i][j]为有i个未放入的可辨别的砖块和j个未放入的不可辨别的砖块时,放入不可辨别的砖块的重量期望值。num1,tot1分别是可辨别砖块的个数和重量和;num2,tot2分别是不可辨别砖块的个数和重量和。那么dp[i][j] = (num2-j)*dp[i][j]/(i+num2) + j*dp[i][j-1]/(i+num2) + i*dp[i-1][j]/(i+num

2016-04-16 23:38:00 348

原创 Light OJ 1420 - Subsequences forming Strings (DP)

解析:设dp[i][j][k][0]为用A[1...j]和B[1...k]构成C[1...i]且最后一个字母是从A中取得的方案数。设dp[i][j][k][0]为用A[1...j]和B[1...k]构成C[1...i]且最后一个字母是从B中取得的方案数。状态转移方程: dp[i][j][k][0] = (dp[i][j-1][k][0] + (s[2][i]==s[0][j]?

2016-04-16 11:54:21 290

原创 Light OJ 1302 Independent Attacking Zones(分治或DP)

解析:对于[1...n],将第n个队伍和[1...n-1]中的两个队伍i,j构成一个三角形,那么 ans[1...n] = ans[1...i-1]*ans[i+1...j-1]*ans[j+1...n][code]:#include#include#include using namespace std;typedef long long LL; char s[75

2016-04-16 11:49:38 407

原创 Light OJ 1274 Beating the Dataset (推公式)

解析:首先算出yes的个数m首先答案要加上第一个结果是no的情况数,然后那么第i和第i+1个结果是yes no或no yes,答案就要加上对应的情况数。[code]:#include#include#include using namespace std; int n,m; int main(){ int i,j,cas; scanf("%d",&c

2016-04-16 11:44:02 482

原创 Light OJ 1299 Fantasy Cricket (DP)

参考:点击打开链接解析:dp[i][j]为前i个字符 有j个U没有确定位置的方案数。则dp[i][j] = dp[i-1][j]*j+dp[i-1][j+1]*(j+1)*(j+1)  (s[i] = 'D')dp[i][j] = dp[i-1][j-1]+dp[i-1][j]*j (s[i] = 'U')[code]:#include#include#incl

2016-04-14 19:07:51 369

原创 Light OJ 1295 Lighting System Design (DP)

解析:将灯按v排序后记录一下数量的前缀和,然后dp就好了。dp[i] = max(dp[j]+Ki+Ci*sigma(L[j+1...i]));[code]:#include#include#include#define th(x) this->x=x;using namespace std;struct Node{ int v,k,c,l;

2016-04-14 13:58:48 331

原创 Light OJ 1270 Tiles (II) (状压DP)

解析:显然的状压DP,每一行怎么填补空缺用搜索就好,就是繁琐了些。[code]:#include#include#include using namespace std;typedef unsigned long long LL; char s[105][105];int n,m,a[105],b[8],c[8],d;LL dp[105][1<<8],tmp_

2016-04-14 13:54:19 219

原创 Light OJ 1277 Looking for a Subsequence

解析:先用二分求出以a[i]为首的最长子序列长度,往后贪心着取就是了。[code]:#include#include#include#include #define pb push_backusing namespace std;const int maxn = 1e5+5;const int INF = 0x3f3f3f3f; int n,m,a[maxn],b[

2016-04-14 13:46:30 268

原创 Light OJ 1264 Grouping Friends (DP+枚举子集)

题意:将所有人分若干组,使得每组的不满意值的和最小。解析:预处理出来每个可能的组的不满意值,再枚举一下自己即可。[code]:#include#include#includeusing namespace std;const int INF = 0x3f3f3f3f;int n,d[15][15],f[1<<15],dp[1<<15];void sol(){

2016-04-05 12:24:54 388

原创 Light OJ 1252 Maintaining Communities (树形DP)

状态真是不如去年现场赛的时候了,这么一个简单的树形DP都写出了俩bug。。。解析:设dp[u][j]为维护u所在的子树,且u所在连通块的花费为j的最少连通块数目。令v是u的子节点,w为其边权若将v所在的连通块与u分离,则dp[u][j] = dp[u][j]+min(dp[v][t]) (0若将v所在的连通块与u连接,则dp[u][j] = min(dp[u][j-w-t]+d

2016-04-05 09:46:54 537

原创 Light OJ 1230 Placing Lampposts(简单树形DP)

解析:dp[u][0]在以u为根的子树中,顶点u不安装的最少安装数目;dp[u][1]在以u为根的子树中,顶点u安装的最少安装数目。则有 dp[u][0] = sigma(dp[v][1]);dp[u][1] = sigma(min(dp[v][0],dp[v][1]))。再开一个num[][2]数组记录每个状态下的两端点都安装了的边数。[code]:#include#i

2016-04-04 21:27:28 223

原创 Light OJ 1228 e-Friends (状压DP)

解析:dp[S][i][k]为队列中以有S中的人,且队尾是i,不满意的个数为k的方案数。则dp[S][i][k] = sigma(dp[S^(1[code]:#include#include#includeusing namespace std;typedef long long LL;int n,m,q,mp[12][12];LL dp[1<<12][12][12];

2016-04-04 18:51:55 227

原创 Light OJ 1223 Testing Mailboxes (DP)

解析:记忆化一下就好,整体的复杂度是小于10^8的。[code]:#include#include#includeusing namespace std;typedef long long LL;const int INF = 0x3f3f3f3f;int n,m,dp[105][105][105];void init(){ int i,l,r; mem

2016-04-04 16:57:48 246

原创 Light OJ 1194 Colored T-Shirts (状压DP)

解析:举个例子,{2 1 4 3 1 2}目标序列{* * * * * *}假设我先把数字1放入目标序列尾部则有{* * * * 1 1} 交换次数为 5+6-2-5 = 4次(序列位置和的差)然后我把数字2放入尾部则有{* * 2 2 1 1} 则是再像上面那样做差得出的是3+4-1-6 = 0显然是不对的。因为1的位置的改变使第2个2的位置左移两位,所以应该是3+4-1-4

2016-04-04 15:20:33 327

原创 Light OJ 1106 Gone Fishing (DP)

解析:由于路径的输出要求,这里使用逆推的方式更加合适。设dp[i][j]为从i开始,剩余时间为j的最大捕鱼量。枚举在第i个湖上钓鱼的时间k,则有dp[i][j] = max(dp[i+1][j-k]+k时间内能钓到的鱼的数量)[code]:#include#include#includeusing namespace std;int n,m,f[30],d[30

2016-04-04 10:46:23 312

原创 Light OJ 1180 Software Company (二分+DP)

题意:有两个任务A,B,每个任务可以分成相同且独立的m个子任务。有n个员工,第i个员工完成A的一个子任务的时间是a[i],完成B的一个子任务的时间是b[i]。求完成所有任务所需要的最短时间。解析:首先想到了二分时间,判断在规定时间内是否能完成任务。但是怎么判断,想了好久,最后还是参考了别人的想法。每一个人是独立的,每一个小任务也是独立的,对于员工i来说,可以完成x个A的任务,并完成y个B的

2016-04-03 12:55:41 372

原创 LightOJ 1173 The Vindictive Coach (DP)

解析:关于题意的理解参考:点击打开链接设dp[i][j] 为考虑前i个位置且高度小于第i个位置的人数为j的方案数。状态转移方程:dp[i][j] = i&1? sigma(dp[i-1][j-k]):sigma(dp[i-1][j+k])[code]:#include#include#includeusing namespace std;typedef uns

2016-04-02 22:59:40 393

原创 Light OJ 1157 LCS Revisited (DP)

解析:dp[i][j]是s[1..i]与t[1...j]的LCS长度,num[i][j]为不同LCS的个数。关键点在于s[i]!=t[j]且dp[i-1][j]=dp[i][j-1]时如何转移。如果dp[i][j]!=dp[i-1][j-1]且dp[i-1][j]=dp[i][j-1],说明s[i]=t[j-1]且s[i-1]=t[j],这时num[i][j] = num[i-1][j]+

2016-03-30 18:44:28 508

转载 Light OJ 1147 Tug of War (背包+状压)

参考:点击打开链接[code]:#include#include#includeusing namespace std;typedef long long LL;const int maxn = 2e5+5;int n,m,a[105];LL dp[maxn];int mabs(int x){ return x<0?-x:x; }int main(){ i

2016-03-30 15:37:22 322

原创 HDU 4595 Similar Number (主席树)

解析:首先,求出对于每一个位置i,以第i个元素结尾的相似序列的最大长度和最小长度,用lb[i]和rb[i]记录对应的位置,形成一个三元组(i,lb[i],rb[i])。这个可以通过递推在O(n)内求出,然后将三元组映射成二维平面的线段(i是纵坐标,lb[i],rb[i]是左右端点的横坐标)。对于[l,r]的查询,就是对纵坐标[1,r]的所有线段中位于[l,r]的和。用主席树就可以实现。

2016-03-28 21:42:55 436

原创 Light OJ 1092 Lighted Panels (状压)

解析:可以参考POJ 3279。不同的是这里要把最上面一行和最左一行一起状压。[code]:#include#include#includeusing namespace std;const int INF = 0x3f3f3f3f;char mp[10][10];int n,m,state[10][10],flip[10][10];void init(){ i

2016-03-25 11:52:38 363

原创 LightOJ 1073 DNA Sequence (状压DP+字符串比较)

题意:给出n个字符串,求包含这n个字符串为子串的最短的串,如果有多个满足条件的字符串,输出字典序最小的字符串。解析:求串的最短长度非常容易,KMP处理出一个L[i][j](将i拼接到j的前面需要增加的最少的字符数),然后状压DP即可。难住我的是字典序最小。。。不过最后的做法估计的效率应该也不是最好的。。在DP转移的时候记录其前驱,在更新的时候如果长度相等,就和原先的前驱进行比较。关键是

2016-03-24 21:16:25 581

原创 LightOJ 1018 状压DP

解析:这个题目的关键就是在于怎么把复杂度降到O(n*2^n)状压是肯定会想到的,可一般的思路是枚举线来进行状压,这样O(n^2*2^n)是会TLE的。正确的降复杂度的方法是:枚举线的时候固定一个点,再枚举其他的点形成一条线(因为每一个点都是必须要被某条线覆盖的这样就讲了一个n的复杂度。[code]:#include#include#includeusing na

2016-03-22 18:52:34 424

原创 Light OJ 1402 Assassin`s Creed (状压DP)

参考了Alex » LightOJ1406 – Assassin`s Creed(状压dp)并做了一点简单优化。通过DFS预处理出所有的可达状态,然后状压,值得注意的是枚举子集的复杂度在n=15是近似1.5e7,所以不会超时。[code]:#include#include#include#include#include#include#define pb push_bac

2016-02-20 11:39:37 235

原创 Light OJ 1421 Wavio Sequence (简单DP)

解析:正反向求每个位置对应的最长子序列即可。[code]:#include#include#include#include#includeusing namespace std;const int INF = 0x3f3f3f3f;const int maxn = 1e5+5;int n,a[maxn],b[2][maxn],dp[maxn];int main(){

2016-02-19 22:34:04 300

原创 Light OJ 1382 The Queue(树形DP+数学)

题意:n个人排队,每个人b除CEO外都有一个监督人a,b必须排在a的后面,问有多少排队方案。解析:显然是一个树形DP。设dp[i]为以i为根的子树中对应的方案数,num[i]是以i为根的子树的节点数。下面考虑将两个队伍v1,v2合并一个队伍。其对应的方案数为C(num[v1]+num[v2],num[v1])*dp[v1]*dp[v2]。依据这个进行dfs。[code]:#

2016-02-18 23:37:30 393

原创 Light OJ 1360 Skyscraper (线段树+DP)

解析:设dp[i]为[0,i]层内的最大获利,最高层为bound。先将每一个广告按底层位置排序,然后按次序,当考虑第i个广告(l底层位置,r顶层位置,v获利)时,则有dp[j] = max(dp[j],dp[l-1]+v)  ,r用线段树维护序列。[code]:#include#include#include#define lson l, mid ,rt<<1#d

2016-02-18 22:35:11 326

原创 Light OJ 1334 Genes in DNA (扩展KMP)

解析:假设D的当前位置为i,D[i...n-1]与G[0...m-2]的最长公共前缀长度为t,B[j] 为以D[j]结尾的与G[i]的后缀匹配的个数。那么以D[i]为首的满足条件的串的个数 = sigma(B[k]) , i+1t均可用KMP求得。对于B[],可以将字符串反向后,再用KMP和树状数组(或端点标记后累加)求得。[code]:#include#include

2016-02-18 18:40:55 237

原创 Light OJ 1327 Help the Winners (状压DP)

解析:先将2视为0,得到不存在super matching pair的使所有女孩高兴的匹配方案数A。然后利用容斥的思想,求不存在super matching pair的所有的匹配方案B。res = A+n!-B。以求A为例,设dp[i][S]为考虑前i个shoes,已匹配的状态为S的方案数。则dp[i][S] = sigma(dp[i-1][S^(1>j&1且s[i][j]=1

2016-02-18 16:59:01 356

原创 Light OJ 1326 Race (Strling数)

解析:先确定n匹马的位置有k个,然后就是把n个不同物品分到k个不同箱子,箱子非空的方案数。枚举k求和即可。[code]:#include#include#include#include#include#includeusing namespace std;const int MOD = 10056;int n,S[1005][1005],Mul[1005];void

2016-02-18 11:43:11 232

原创 Light OJ 1316 A Wedding Party (最短路+状压DP)

解析:首先要预处理出0,V-1,shop之间的最短路径,然后用状压DP找出经过S中节点到达V-1的最短路,最后遍历一遍所有的S即可。[code]:#include#include#include#include#include#includeusing namespace std;typedef pair PII;const int INF = 0x3f3f3f3f;

2016-02-18 11:31:59 269

原创 Light OJ 1298 One Theorem, One Year (DP)

解析:欧拉函数公式:phi(n)=n(1-1/p1)(1-1/p2)(1-1/p3)...(1-1/pk),其中pi为n的素因子。有了这个公式 ,我们只需要求出对应的数字的和就好了。dp[i][j] = 用前i+1个素数组成j个素数积的各数字的和。(有点绕……状态转移:dp[i][j] = prime[i]*(dp[i][j-1]+dp[i-1][j-1])。[code]:

2016-02-17 11:57:42 318

原创 Light OJ 1287 Where to Run (状压+期望)

解析:仍然是个期望的逆推,再加上了一个TSP而已。dp[S][i] = 遍历了S中的每一个节点后位于i节点的期望值。dp[S][u] = (dp[S][u]+5)/(cnt+1) + sigma(dp[S][v]+mp[u][v])/(cnt+1)cnt是下一步的方案数,v是与u相连的合法的节点。[code]:#include#include#include#defin

2016-02-17 10:20:27 383

原创 Light OJ 1283 Shelving Books (DP 分治)

解析:这个题目其实就是一个分治。现在有n本书,那么第1本书有三种可能,一是不放,再者就是在第1本书可以放入的前提下放入左侧或右侧。这样问题的规模从n本书变为n-1本书。对于是否可以放入,就需要记录左侧和右侧书的编号。根据此来记忆化搜索。[code]:#include#include#includeusing namespace std;const int INF

2016-02-16 16:49:57 526

原创 Light OJ 1257 Farthest Nodes in a Tree (II) (树形DP)

解析:树直径的模版题。[code]:#include#include#includeusing namespace std;const int maxn = 30005;struct Nod{ int b,val,next; void init(int b,int val,int next){ this->b=b;this->val=val;t

2016-02-15 11:41:37 336

空空如也

空空如也

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

TA关注的人

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