随笔分类 - POJ
摘要:状态压缩DP(使用位运算加速)这是个经典的状态压缩DP,为加深印象详细写写一下报告,由于是中文题目所以不说题意了思考方法:首先,一个炮的攻击有两行,所以对于第i行来讲,i-1行和i-2行对它有影响,i-3行及以上的都没有影响了,所以我们要得到第i行的信息,只需要知道i-1和i-2的信息(最近有个体会,DP要找到什么因素影响了当前你要求的东西,有影响的我们就处理,没影响的我们不用管)。接着我们就思考怎么表示状态。山用1表示,空地用0表示,空地放了兵也用1表示,那么对于一行,就是一个01的串,这是个二进制数,我们可以想到状态压缩压缩回来一个十进制数。比如原地图01101011,那么0处可以放兵,所
阅读全文
摘要:线段树(经典题)离散化+成段更新+区间统计题意:先输入case数,每个case输入n,表示下面有n个海报,每行就是海报的左右坐标,第i个海报的颜色为i。一面墙长度固定为10000000,问这些海报贴上去后能看到多少种颜色这个问题的难处其实是怎么离散化(也就是映射,映射后就是简单的线段树整段更新,最后区间询问)。今天第一次学离散化,说说个人的解法方法是和别人的大概一样的,可能代码实现有些不同,我的代码可能空间开销更大些(后来查看代码,很多空间能省略,但是下面的代码是我最原始的代码,并没有后来的优化,就以此来讲解)。int s[MAXN][2]; 保存原始的数据,[0]是起点坐标,[1]是终点坐标
阅读全文
摘要:线段树题意:输出N,T,M,表示总区间长度([1,N]),有T种颜色(1到T表示),接下来有M个操作。C,a,b,c类型的操作是成段更新,把区间[a,b]的颜色改为c。P,a,b类型的操作是询问区间[a,b]有多少种不同的颜色分析都在代码里面了/*成段更新,询问一个区间内有多少种的不同的颜色每次询问之前清空一个颜色的标记数组,然后开始询问,去到一个区间,若val为1说明整段的颜色相同,不用再继续深入,若为0说明颜色不止一种要继续深入。每次val为1时要判断这个颜色col是否已经被记录,只有没被记录的才能计数,而且要记录该颜色已经被用过至于成段更新,要用到LAZY。到达目标区间后不要再继续深入。
阅读全文
摘要:最短路 OR 搜索这题大多数是归为图论题,求最短路径,看了一下题目,确实是这样的意思,但是我却很难想到怎么最短路。后来觉得搜索更形象易懂所以写了一个dfs,但是wa,然后看了一下解题报告才发现有个地方理解错题意了。根据题意做了小修改就过了题意:其实就是找一条最短路径,但是路径中任意两个点的等价差不能超过限制值(我一开始的理解是两个直接相连的点的等级差不能超过限制值)/*建图:一个物品就是一个点,一个物品能容另一种物品来换,那么就是两个物品间可能相连,为什么是可能,因为还要两个物品的等级满足条件。因为物品数上限为100,用邻接矩阵来建图方便。再注意一点,这是个有向图,要得到i物品可以用j物品来换
阅读全文
摘要:再学欧拉路无力再写题解报告了,最近写得最难受的一道题,前前后后调试了有10来个小时,就一个这么个BUG#define N 30#define MAX 1010开某些数组的时候把N和MAX写反了但是…………代码还是有问题的,G++一直过不了,一直是WA,C++可以过,等下还要调试,一定要把G++给过了题意:和poj 1386 是一样的题目,不过这次要输出路径,而且要字典序最小做法:用邻接表来构建有向图(我的构建方法和网上找来的不一样,不是用白书介绍的那种模拟链表的头插法,而是直接一点,比较然后插入,已有的元素向后移,感觉在时间上没什么差距)。然后用并查集来判断有向图的基图是否连通(其实直接用邻接
阅读全文
摘要:再学欧拉路,没搞清楚定理错了好几次题意:给你n个单词,要求这些单词相连,要求是前面的字母的尾字母和后面单词的头字母相同,问你这n个单词能不能全部连起来,可以连成一条链或者连成一个环另外单词只有小写字母。很容易想到,顶点集合就是26个小写字母,用1到26来表示,一个单词的首字母和尾字母就是一条有向边,注意是有向边,因为单词是不能倒回来的其实就是问你这个图是否存在欧拉道路(一条链的情况)或者欧拉回路(环的情况),反正存在欧拉路就是成功的,否则就是失败判断有向图是否有欧拉路1.判断有向图的基图(即有向图转化为无向图)连通性,用简单的DFS即可。如果图都不连通,一定不存在欧拉路2.在条件1的基础上 对
阅读全文
摘要://滑雪,记忆化搜索解决//dp[i][j]表示从(i,j)开始出发所能滑的最长长度//显然状态转移方程为dp[i][j]=max{上下左右四个方向的dp值}+1;//我们只需要在DP过程中时刻更新最大值MAX即可#include <stdio.h>#include <string.h>#define N 110int R,C;int a[N][N],dp[N][N],MAX;bool vis[N][N];int x[5]={0,-1,1,0,0}, y[5]={0,0,0,-1,1};void DP(int i , int j){ int k,xx,yy,tmp; i
阅读全文
摘要:LIS裸题, 是严格递增的不是 不下降子序列(一开始看错了WA了好几次)O(n*n)#include <stdio.h>#include <string.h>#define N 10100int a[N];int n;void LOS(){ int dp[N],i,j,tmp,max; memset(dp,0,sizeof(dp)); dp[1]=1; max=1; for(i=2; i<=n; i++) { for(tmp=0,j=1; j<i; j++) if(a[i]>a[j] && dp[j]>tmp) ...
阅读全文
摘要:判断MST的唯一性用kruskal算法实现,主要利用MST的环性质先保存所有的边在一个边集数组a中,然后单独去构建一个MST,在a中没能用上的非安全边全部放到另一个边集数组b中另外在构建MST过程要构建一个邻接表,用vextor来实现,也就是只统计MST之间的连通情况,非安全边的不统计在内例如 1 2 3(安全边) 1 3 4(非安全边)那么邻接表中,与点1相通的点有点2但是没有点3,因为点3不在MST中,所以在MST中遍历的时候是没办法直接从点1到点3的接下来是就利用MST的环性质,一个MST中不管加入那条非安全边都将会形成一个环。所以我们枚举所有的非安全边,一条非安全边e,(u,v)权值为
阅读全文
摘要:最优比率生成树,网上能找到很多相关的题解和资料,这道题也不是我自己独立完成的,也是看了算法和原理才做出来的相关的知识点有二分,01分数规划,Dinkelbach算法,牛顿迭代法,查阅这些知识点都会对理解这道题有帮助并且能学到新的知识具体的题解就不写了,直接贴找回来的那个讲解,看完基本上都懂了****************************************************解法之一 0-1分数规划设x[i]等于1或0, 表示边e[i]是否属于生成树.则我们所求的比率r = ∑(benifit[i] * x[i]) / ∑(cost[i] * x[i]), 0≤i<m.
阅读全文