摘要: 题目链接题意:给定一个01串S,求出它的一个尽可能长的子串S[i..j],满足存在一个位置iusing namespace std;const int N = 1e6 + 11;char s[N];int a[N];int pre[N], suf[N];int start[N], end[N];in... 阅读全文
posted @ 2015-08-14 22:30 BeatLJ 阅读(735) 评论(0) 推荐(0) 编辑
摘要: 毕业设计要做摄像机的参数标定,角点检测是一个重要步骤。View Code close all;clear all;clcim=imread('checkbord.png');im=rgb2gray(im);[m n]=size(im);I=zeros(m+2,n+2);Ix=zeros(m+2,n+2);Iy=zeros(m+2,n+2);R=zeros(m+2,n+2);flag=zeros(m,n);I(2:m+1,2:n+1)=im;Ix(:,2:n)=I(:,3:n+1)-I(:,1:n-1);Iy(2:m,:)=I(3:m+1,:)-I(1:m-1,:);A=Ix(2 阅读全文
posted @ 2013-04-01 16:54 BeatLJ 阅读(311) 评论(0) 推荐(0) 编辑
摘要: 题意描述很纠结,前后WA了数十次……AC后的理解:给一棵树,每个结点有2个值,bug和brain,要获取brain必先消灭bug,现从结点1出发,给你m个starship troopers,每个starship troopers能对付20个bug,问最多能得到多少brain。在攻克的过程中,对于途中经过的结点,如果该点bug不为0,则要留下一个starship troopers在此结点,否则不需留。对于叶子结点,即使bug为0,也要派starship troopers去收获brain。data:5 00 1 0 1 0 5 0 1 0 2 1 2 1 3 2 4 2 55 20 1 0 1 0 阅读全文
posted @ 2012-10-10 10:01 BeatLJ 阅读(426) 评论(0) 推荐(0) 编辑
摘要: 题意:求区间[A , B]中能被自身的数位和整除的数有多少个。1 <= A <= B <= 109 分析:由于在DP的过程中不知道最后的数位和是多少,所以状态不好设计,但是考虑到数位和最大是81,所以可以用类似枚举数位和的思想来设计状态。View Code #include <stdio.h>#include <string.h>#define N 11int digit[N];int dp[N][82][82][82];int dfs(int pos,int sum,int mod,int m,int f){ if(pos==-1) return ( 阅读全文
posted @ 2012-10-05 17:09 BeatLJ 阅读(301) 评论(0) 推荐(0) 编辑
摘要: 题意:给一棵树,问最少砍断多少条边才能产生一个恰含m个结点的子树。分析:将树有根化后,我们考虑以 i 为根结点的子树,要在这棵子树内产生一个结点数目为 j 的子树,要么包含结点 i ,要么不包含,所以定义 dp[i][j][0]表示从以结点 i 为根的子树中得到恰含 j 个节点且不含结点 i 的子树最少需要砍掉的边数,dp[i][j][1]表示从以结点 i 为根的子树中得到恰含 j 个节点且包含结点 i 的子树最少需要砍掉的边数。初始化:树DP中的初始化其实可以把所有结点都看成是叶子结点来处理,dp[i][0][0]=0,dp[i][1][1]=0,其余的全初始化为INF状态转移:dp[a][ 阅读全文
posted @ 2012-09-22 09:42 BeatLJ 阅读(266) 评论(0) 推荐(0) 编辑
摘要: 题意:现有一棵苹果树,树中每个结点上都有一定数量的苹果,问若从根结点出发,最多只能走K步(每一步都只能从一个结点走到相邻结点),最多能摘多少苹果。分析:定义dp[i][j][0],表示从 i 出发,向下走 j 步,最后回到 i 最多能摘的苹果数,dp[i][j][1]表示从 i 出发,向下走 j 步最后没有回到 i 最多能摘多少苹果。View Code #include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define N 101int n,e,step,w 阅读全文
posted @ 2012-09-20 17:10 BeatLJ 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 题意:对一棵树,求出从每个结点出发能到走的最长距离(每个结点最多只能经过一次),将这些距离按排成一个数组得到d[1],d[2],d[3]……d[n] ,在数列的d中求一个最长的区间,使得区间中的最大值与最小值的差不超过m。分析:用2次dfs能求出树的直径,对于树中任意结点,到树的直径的2个端点的距离的较大者即为最长距离。得到数组d后,用2个单调队列分别维护最大与最小值,扫描d数组,同时更新答案。View Code #include <stdio.h>#include <string.h>#include <algorithm>using namespace 阅读全文
posted @ 2012-09-20 16:58 BeatLJ 阅读(694) 评论(0) 推荐(0) 编辑
摘要: 题意:一个电视网络要转播一场比赛,电视网络的拓扑结构是一棵树,树根是总站,叶子结点都是用户,树边权为信号通过此边的费用,转播总费用为信号通过的所有边的权和,现已知每个用户愿意交付的费用,问电视台在不亏本的情况下最多能为多少用户转播比赛。分析:定义dp[i][j]为从结点 i 往下给 j 个用户转播比赛的最大利润,最后的答案就是使 dp[1][j] 非负的最大的j,可以二分求解。dfs里面那个 j 循环需要根据叶子结点的数目进行优化,否则会TLEView Code #include <stdio.h>#include <string.h>#include <algo 阅读全文
posted @ 2012-09-18 17:30 BeatLJ 阅读(314) 评论(0) 推荐(0) 编辑
摘要: 题意:从时间0开始需要接待n个人,对于每个人,可以选择接待或者跳过,若接待,花费的时间是T+ai ,T为开始接待这个人的时间,若跳过则罚时bi ,现给定总时间K,问你最多能接待多少人?分析:如果接待的人的集合确定了,那你一定先接待 bi 小的人再接待 bi 大的人,所以我们可以先按 b 从小到大排序。定义dp[i][j]表示从 i 到 n 的人共接待 j 个人的花费(i 到 n这一段的花费)。dp[i][j]=min( dp[i+1][j] , dp[i+1][j-1] - a[i] + j*b[i] ),最后从大往小找dp[0][j]不超过K的最大的 j 即是答案。View Code #in 阅读全文
posted @ 2012-09-18 17:18 BeatLJ 阅读(291) 评论(0) 推荐(0) 编辑
摘要: 题意:n个地点构成一棵树,第 i 个地点有 t_i 个人,现要选一个地点开会,求所有人行走距离之和的最小值。N<=10^5分析:先任选一个地点,求出总代价,然后就能求出相邻点的代价,一遍dfs就能求出所有点的代价。dfs会爆栈,需要开内存挂:#pragma comment(linker, "/STACK:1024000000,1024000000")View Code #include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#defin 阅读全文
posted @ 2012-09-17 17:33 BeatLJ 阅读(255) 评论(0) 推荐(0) 编辑