![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
poj
Pro_space
从蒟蒻开始成长~
展开
-
poj2970
这个题被丁神教育了c++调用优先队列的姿势。。。下面总结一下。。#includepriority_queue,cmp>第一个和第二个xxx是当前堆里的数据类型,第三个参量则是一个比较的结构体,和sort里的cmp不同,堆里的cmp要求是一个结构体,而且是默认大根堆,不妨认为越小的越在下面。cmp的写法struct rec {int a,b;};struc原创 2015-02-22 10:20:36 · 574 阅读 · 0 评论 -
【DP】sgu104
所谓的花瓶问题。。。经典dp问题。。然而我又是骚气的想出了一种骚气的dp方程dp[i][j]=max(dp[i-1][k]+f[i][j])//注意k要从i-1开始枚举!!!这样dp方程的好处就是有一种很骚气的输出写法,这个写法的灵感也是借鉴了Poj有个lcs的问题而想到的,上代码#include#include#include#include#include#inclu原创 2015-05-25 23:46:41 · 424 阅读 · 0 评论 -
【DP】poj1185
题意很简单,题目也很水唯一一个容易忽略的地方就是状态数其实没有看起来的那么多,因为有一个攻击范围的限制所以状态数其实很少。然后,脑残的又把数据范围开小了。。。。#include#include#include#include#include#include#define N (1<<9)+(1<<6)+(1<<3)+1+10int map[210],f[3][N][N];i原创 2015-07-14 20:52:37 · 333 阅读 · 0 评论 -
【DP】poj1692
题意:对两个数列找一些匹配满足对于任意一个匹配有且仅有一个与其数字不同的匹配与之交叉。一开始觉得应该是个n^4的,结果想一想发现每次更新的时候,如果a[i]!=b[j]那每次在b里找最近的一个数等于a[i]然后在a里找最近的一个等于b[j]就好,也算是一种贪心的思想,想想,如果再往前找的话肯定不如最近的优于是就是n^3了#include#include#include#include#原创 2015-08-10 13:00:36 · 555 阅读 · 0 评论 -
【DP】poj2486
多校训练的树形dp就没有做出来过,所以最近也是网上把树形dp的题扒出来做一遍。其实跟普通的dp一样,树形dp也是需要找状态,确定状态转移方程,只不过状态转移的过程比较明确,就是从父亲向儿子转移或者儿子向父亲转移,只不过怎么转移通常是很难的问题。。。这个题的难点在于走向某一个节点之后还可能回来,然而也因此,状态就非常明显了,明显要分两类,一类是经过当前节点后回到当前节点,另一种是经过当前节点原创 2015-08-12 21:14:43 · 382 阅读 · 0 评论 -
【DP】poj1947
题目大意:给出一棵树,让你隔断一些边,使得割完后剩下的联通块里有某个联通块刚好包含k个节点,然后隔断的边尽量少也是一道典型的树形dp然后很明显能看出要以每个节点i及其子树中保留j个节点最少割多少次来作为状态这个题大概难点在初始化吧。。想了好久。。。我当时的初始化是f[i][1]=vec[i].size()-1,也就是i节点的总儿子数然后转移分两种一种是选了某个儿子那就是no原创 2015-08-14 13:26:33 · 408 阅读 · 0 评论 -
【树分治】poj1741
题目的意思让求树上点对距离小于等于k的数量每次找到重心然后找有多少符合条件的过重心的点对然后对于子树递归的做因为最多是log层所以每个点最多被遍历logn次最后输出的时候虽然输出了long long但定义ans的时候定的int。。。。wa了好久真是手残#include#include#include#include#include#includeusing namesp原创 2015-09-05 11:40:35 · 368 阅读 · 0 评论 -
【树状数组】poj1794
两组士兵把绳子扔向城墙每组士兵绳子之间相互不交叉两组之间可能会交叉问交叉数目先整体按照农民升序然后城墙降序排序再用树状数组求逆序对数就好了#include#include#include#include#include#includeusing namespace std;int n,m,ans,c[200100];struct rec{ int x,y;原创 2015-12-21 11:09:58 · 446 阅读 · 0 评论 -
【字符串】poj1961
重新理解了一下next数组是失配的之后前一个在哪然后又理解了一下改进算法然后记住一个结论吧,就是循环节=i-next[i]&&next[i]!=0 (i%(i-next[i])==0)i是当前字符减一的长度#include#include#include#include#include#includeusing namespace std;char s[100原创 2015-12-21 13:46:24 · 382 阅读 · 0 评论 -
【图论】Codeforces Round #334 (Div. 2) D.cpp
让你构造一个图,然后最小生成树的边要是给定的边第一次没靠题解做出来d题然后按照克鲁斯卡尔的思路想了一发发现构造成一条链就好了。。。。#include#include#include#include#include#includeusing namespace std;struct rec{ int x,y,v,biao,wei;}bian[301000];bool原创 2015-12-21 20:20:48 · 446 阅读 · 0 评论 -
【DP】poj1037
有点麻烦的一个DP一开始已经想到只跟顺序有关系,但是忘记了只要维护一个上升一个下降就可以解决转移的问题了然后还有一个点就是其实把任意一个数拿出去的话剩下序列跟拿出的数的关系是能推导出的。#include#include#include#include#include#includeusing namespace std;long long f[31][31][3];bool原创 2015-12-04 23:39:49 · 503 阅读 · 0 评论 -
【博弈论】poj1704
相邻两个绑成一组,它就变成了一个#include#include#include#include#include#include#include#includeusing namespace std;int a[201000];int n,t;int main(){ //freopen("test.in","r",stdin); scanf("%d",&t); whi原创 2016-03-30 14:22:26 · 423 阅读 · 0 评论 -
【网络流】poj1087
题意 n个插座, m个硬件,k种转化器,每种转化器有无限个!!问最少有多少个插不上。单纯的网络流,处理字符串那一段有点烦,然后poj的数据好像有点大。要开大一点不然会坑,源点向每个插座连一个容量的边,每个硬件向汇点连一条容量为1的边,然后转换器之间连容量为无穷的边#include#include#include#include#include#includeusing na原创 2016-03-06 22:40:34 · 405 阅读 · 0 评论 -
【DP】poj1722
每次取出两个数相减,其实就是给整个数列标加减号,想明白这一点这个题就好做了,一眼看上去很像一个区间DP啊,然后第二个数一定是只能减的。。#include#include#include#include#include#includeusing namespace std;int T,n,a[101000],f[110][20100],biao[110];int main(){原创 2016-04-02 19:18:21 · 491 阅读 · 0 评论 -
【DP】poj2923
这个是一道状压dp,先预处理出所有可以一次运输的状态,然后在转移就可以了。然而还是有一个地方要注意,两个符号是判断,一个符号是位运算orz....#include#include#include#include#include#includeusing namespace std;bool flag[10010];int q[4][10010],tail[4],c[4],dp[原创 2015-05-20 00:50:12 · 493 阅读 · 0 评论 -
【DP】poj2250
经典的lcs问题,然而却是得到了很多启发,当时并没有想到如果s[i]==ss[j]就可以直接用dp[i-1][j-1]+1转移,仔细想了一下,dp[i][j-1]和dp[i-1][j]一定是递归输出也很巧妙,利用状态的转移,来判断输出路径。第一次sb了,用s[1],s[2]的时候变量定义成了char s[2][310][110]然而下表确乎是从零开始的orz。。。。#include#in原创 2015-05-19 09:33:25 · 505 阅读 · 0 评论 -
poj1837
当时看到挂东西,数据范围那么小,就想成搜索了,但是时间复杂度太高,那么就可能是dp了,但是状压dp又迟迟找不到状态,所以就想到是01背包,只要考虑到没挂一个对于平衡有什么影响就可以了#include#include#include#include#includeusing namespace std;int f[21][15010];int n,g,loc[21],w[21]原创 2015-02-22 11:01:16 · 482 阅读 · 0 评论 -
poj1276
多重背包问题,转化为二进制后,变为01背包问题。转化方法,假设当前某种物品有n件,那么将n件该类物品变为 1个该物品,2个该物品,4个该物品,直至2^k个该物品,2^(k+1)-1据说单调队列能做到n,,,正在学习中#include#include#include#include#include#include#include#includebool原创 2015-03-03 12:19:21 · 358 阅读 · 0 评论 -
【字符串处理】poj1035
本身是个一眼能看出算法的水题,但是实现还是出了很多问题。一开始枚举的太奔放。。直接T掉然后脑抽在了一个地方:其实只要在第一个不同的位置添加或者删除就可以最近的状态也是非常差,水题都做的艰辛,insert和delete借鉴了小优前辈的写法。#include#include#include#include#include#include#include/*先check正确原创 2015-04-22 10:18:59 · 423 阅读 · 0 评论 -
【网络流】poj3436
最近难得1A的题目虽然也是道蛮水的网络流,大概这个题的难度在于读题吧。。。我看了一大堆博文才弄清楚这个题的意思题目意思大概是这样的,给你n个机器,每个机器有一个使用次数,然后有一个进参数和一个出参数,出参数与进参数匹配就可以连边,然后要使最多的全零状态变为1状态Sample input 13 415 0 0 0 0 1 010 0 0 0 0 1 130 0原创 2015-04-22 23:50:37 · 738 阅读 · 0 评论 -
【字符串处理】poj3080
也是一道水题,但是看到还以为要用到KMP之类的东西,后来发现只要暴力就好了 成就不在于写了多么高超的算法、、 这是第一个不借助博客自己看懂的题。。。果然还是太弱了吗。。。 暴力枚举匹配,1A轻松。。 虽然手速还是不快,从单步调试到输出调试果然还是很难适应#include#include#include#include#include#includeusing namespa原创 2015-04-23 19:39:18 · 320 阅读 · 0 评论 -
【字符串处理】poj1936
也是个水题,两个串一一比较就行。,。。。现在只能1A这种水题了#include#include#include#include#include#includeusing namespace std;int main(){ char s[3][100100]; while (scanf("%s",s[1])!=EOF) { scanf("%s"原创 2015-04-23 22:50:19 · 479 阅读 · 0 评论 -
【树结构】poj1470/ZOJ1141
最近真的是连切水题都切不来了,这个题的输入有点恶心。。但是算法并不难,我用倍增lca水过了;所谓倍增lca,就是用一个fa【x】【i】数组,记录离x这个节点网上2^i的节点是哪个。fa【x】【i】=fa【fa【x】【i-1】】【i-1】;话说Poj现在真是各种崩坏,只能转投zoj或者hdu了。。附ZOJ1141代码,据说POJ加了新数据,导致过了ZOJ不一定能过POJ,所以原创 2015-04-20 23:47:25 · 401 阅读 · 0 评论 -
【数位DP】poj3252
也具体不知道能不能算作数学题,姑且就归做数位DP了,各种小细节卡了半天题意是让求区间【a,b】中有多少个符合要求的数,所谓要求就是这个数的二进制下的0的个数要大于等于1的个数;这种区间题首先想到的是用【1,b】的合格数减去【1,a-1】的合格数,这样我们就只需要找1->小于等于某一个数的所有合乎要求的数就行了。假设一个数的二进制位是 1011001,原创 2015-04-20 18:10:26 · 392 阅读 · 0 评论 -
【DP】poj1636
#include#include#include#include#include#includeusing namespace std;int link[1100],n,tmp_1,tmp_2,tail,m,tot,f[510][4];bool flag[410][310],flag_point[1100];struct rec{int num,next;}e[100100原创 2015-05-13 12:10:03 · 447 阅读 · 0 评论 -
【DP】poj1671
题意....挺简单的就自己读吧。做法..更简单了.dp方程f[i][j]=f[i-1][j]*j+f[i-1][j-1];f[i][j]表示长度为i其中最大数为j#include#include#include#include#include#includeusing namespace std;double f[210][210];int n;int main(){原创 2015-05-14 15:49:25 · 588 阅读 · 0 评论 -
【DP】poj1155
这个题算法不难想,然而感觉这个复杂度的计算比较感人,我现在也不明白这个题是怎样过了nf[i][k]表示在i这个节点选取k个叶子的最大值。。。在枚举当前子节点选多少个。。。上代码#include#include#include#include#include#includeusing namespace std;int n,m,link[10010],f[3040][3040],s原创 2015-05-20 14:32:29 · 315 阅读 · 0 评论 -
【DP】poj2184
这个网上大多数都是用一种偏移的思想做的,然而这样的话dp要分两种来做,但是如果运用滚动数组的话,既能使空间得到优化,也可以使dp只需要正向做一次就可以。f[1][j]的状态用f[0][k]来转移,这样就不会出现多次填装的问题。然而需要注意一点的是,f[1]一开始要初始化成和f[0]一样的。。。。因为这个问题wa了很多炮。。。#include#include#include#inclu原创 2015-05-18 22:40:27 · 484 阅读 · 0 评论 -
【DP】poj1458
基础的lcs问题。。。至于lcs是什么。。。。百度好了啊。。话说应该有一篇报告是写了怎么推到(推导)lcs公式的所以就随便粘个代码吧#include#include#include#include#include#includeusing namespace std;int f[1010][1010],len1,len2,maxf;char s[3][2010];in原创 2015-05-22 11:44:30 · 300 阅读 · 0 评论 -
[dp+图论] poj1112
#include#include#include#include#includeusing namespace std;int f[110][110];int sum[110][3];int dp[105][105][105];int de[105][105][105];int col[110][3];int ans0[120],ans1[120];int n;bool原创 2016-05-12 20:22:22 · 532 阅读 · 0 评论