摘要: 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) ... 阅读全文
posted @ 2012-10-26 11:02 Titanium 阅读(121) 评论(0) 推荐(0) 编辑
摘要: 裸题,最大子矩阵和,将二维压缩为一维,以行为准,每次枚举一行的和(从i列到j列的和),再对行进行最大子序列和DP求解,时间复杂度为O(N^3)#include <stdio.h>#include <string.h>#define INF -1000000000#define N 110int a[N][N];int sum[N];int n;void input(){ int i,j; scanf("%d",&n); for(i=1; i<=n; i++) for(j=1; j<=n; j++) scanf("%d&q 阅读全文
posted @ 2012-10-26 10:44 Titanium 阅读(165) 评论(0) 推荐(0) 编辑
摘要: 简单骑士周游问题,BFS,有障碍物,(可能存在无障碍物的情况),起点和终点不会相同,起点终点无障碍物若能从起点出发到终点则输出步数,否者输入不能到达#include <stdio.h>#include <string.h>#include <queue>#define N 70using namespace std;bool g[N][N];int b;int start,end;struct node{ int n,r,c,k;};queue<struct node> q;int BFS(){ int ans,i,k,R[10],C[10],F 阅读全文
posted @ 2012-10-26 10:41 Titanium 阅读(492) 评论(0) 推荐(0) 编辑
摘要: 其实解释POJ 2533 原题最长上升子序列,用O(N*N)算法和o(n*logn)算法分别实现,学校OJ的数据比较弱,就算写成最长不下降子序列也可以通过,但是在POJ上是WA的而题意本身应该是严格递增的o(N*N)#include <stdio.h>#include <string.h>#define N 10010int 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(t... 阅读全文
posted @ 2012-10-26 10:37 Titanium 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 图论入门题,找多少个八连块,简单的dfs解决//给出一个m*n的矩阵,有些方格染色,一个方格的邻接方格有8个,就是它四周的八个//一个染色的方格的邻接方格中也有染色的话那么把他们看做是一起的,都归为一个八连块//题目要找这个矩阵中有多少个八连块#include <stdio.h>#include <string.h>#define N 110#define M 110bool a[M][N],vis[M][N];int m,n;void dfs(int i , int j){ if(!a[i][j] || vis[i][j]) return ; vis[i][j]=1; 阅读全文
posted @ 2012-10-24 23:37 Titanium 阅读(231) 评论(0) 推荐(0) 编辑
摘要: 很简单的骑士周游问题,简单的BFS一个骑士在当前位置的话可以像8个方向走,至于骑士是怎么走的可以百度一下记录起点和终点的行列并算出它的标号(整个棋盘是8*8的,按行优先去编号从1到64,所以每个格子都会有一个唯一的编号)走了8个方向记录下每个方向的编号,每得到一个编号就判断和终点编号是否相同,是的话就已经走到了,跳出,否则的话这个格子入队另外就是记录步数,就是代码中的k另外要注意判断起点和终点相同的情况,都是输出0#include <stdio.h>#include <string.h>#include <queue>#define MAX 70using 阅读全文
posted @ 2012-10-24 09:55 Titanium 阅读(690) 评论(0) 推荐(0) 编辑
摘要: 判断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)权值为 阅读全文
posted @ 2012-10-21 00:36 Titanium 阅读(244) 评论(0) 推荐(0) 编辑
摘要: 先来骂街一下………………这个OJ太神了,搞死我了,好像一定要初始化某个数组还是怎么样,至今搞不明白,我还特意搞了很多个初始化,总之有初始化就通过,没有就得吃WA,问题是那个初始化时没有必要的……………………说说算法,就是和矩阵链乘法的DP是一模一样的,用a[N]来记录n个数字,op[N]记录操作符,下标是1到N,op[i]表示a[i]后面跟的操作符,所以op[n]是没有的,赋值为"&"做个标记;如果整个表达式都是正数的话,那么很容易处理,但是数字有些是负数,我们来考虑这种情况,表达式的两部分都是负数的话相乘为正数,有可能比只用正数求的结果还大。但是我们应该使两个负数 阅读全文
posted @ 2012-10-19 21:40 Titanium 阅读(263) 评论(0) 推荐(0) 编辑
摘要: 最优比率生成树,网上能找到很多相关的题解和资料,这道题也不是我自己独立完成的,也是看了算法和原理才做出来的相关的知识点有二分,01分数规划,Dinkelbach算法,牛顿迭代法,查阅这些知识点都会对理解这道题有帮助并且能学到新的知识具体的题解就不写了,直接贴找回来的那个讲解,看完基本上都懂了****************************************************解法之一 0-1分数规划设x[i]等于1或0, 表示边e[i]是否属于生成树.则我们所求的比率r = ∑(benifit[i] * x[i]) / ∑(cost[i] * x[i]), 0≤i<m. 阅读全文
posted @ 2012-10-19 13:01 Titanium 阅读(657) 评论(0) 推荐(0) 编辑
摘要: 最小生成树的入门题,和普通裸题有些区别,需要做出一点修改题目是要求两个岛的直接连线要大于等于10小于等于1000而不是说任意两个岛的路径和都是要满足这个条件,否则的话,要满足任意两个岛的路径和满足这个条件还是比较麻烦的显然这道题用prim算法实现才好,因为最多有n*(n-1)/2条边用kruskal算法不好在prim模板中要修改两个地方几个,一个是初始化 for(i=1; i<=n; i++) { adj[i]=1; if(g[1][i]>=MIN) lowcoat[i]=g[1][i]; else lowcoat[i]=INF; } lowcoat[1]=0;原本是直接lowco 阅读全文
posted @ 2012-10-18 17:01 Titanium 阅读(1082) 评论(0) 推荐(0) 编辑