自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(228)
  • 资源 (1)
  • 收藏
  • 关注

原创 手写数字识别(三)

手写数字识别(三)数字分割、识别1. 数字分割一个比较简单的方法是通过统计图像的灰度进行划分。先统计每一行的灰度值,对于遇到的空白区间作为划分行,然后以同样方法划分列,以此确定分区。但是很显然这样的方法对于数字密集或者是轻微的倾斜都会有问题。 我写的是通过bfs来划分,首先是通过膨胀处理,然后对于所有未标记的黑点走一次bfs,把同一个联通块看做是一个数字,并且在bfs的同时打上标记,...

2018-07-18 16:38:31 3449

原创 手写数字识别(二)

手写数字识别(二)A4纸教程以及内容分离1. 确定角点顺序我采用的方法是直接上了一个凸包算法:通过极角排序然后做凸包把四个角点按照顺序压如栈中,确保了几个角点按照顺时针的方向排列,并且确定最接近 [0,0] 点的为纸张左上角的顶点。由于纸张为四边形,确保是一个凸包。2. 实现A4纸矫正首先定义对于图像的区域划分 其中 0~3 的区域为需要的A4纸边缘,尺度为图像中尽量...

2018-07-18 14:02:40 1494

原创 手写数字识别(一)

手写数字识别(一)纸张边缘检测以及寻找角点项目基于c++ 的 CImg库1. 读取图片通过CImg构造函数从对应路径中读出图像string infile = "../Dataset/";infile = infile+file_name+".jpg";CImg<float> in(infile.c_str());效果: 2. 应用Canny对图...

2018-07-18 12:11:39 4141 1

原创 Robo_Eyes_license_recognize System

Robo_Eyes_license_recognize System一个基于ROS平台的车库管理系统项目实现基于flask轻量级Python的Web框架,利用OpenCV进行摄像头图片截取以及保存。通过HyperLPR实现车牌识别、数字文字分割以及识别功能实现1 flask轻量级框架+OpenCV实现屏幕录制截图(像素存在一点小问题~) 2 HyperLPR 通过训练好的...

2018-07-06 13:12:54 330

原创 Coding Contest

给定n个点,m条有向边,每个点有学生和食物,要求所有学生通过有向边获得食物(保证有解)。问题是现在每条边都有线路,第一个学生经过的时候不会碰到,之后每个经过这条线路的学生都有pi的几率会碰到线路导致网络崩溃,要求满足条件的同事使得网络崩溃率最低。 首先要求网络崩溃率最简单就是1-不崩溃的几率。建立费用流,首先考虑如何收费。因为费用流权值只能相加,所以考虑把所有的概率取上log之后变成每条边的费用。其

2017-10-21 09:43:57 421

原创 Castle

KMP 如果集合中有一个字符串 SiS_i长度为i,而且为当前 S 的后缀,那么所有比 i 长度小的都会是 S 的后缀(如果存在于集合),所以求出每个当前 S 的后缀最长匹配前面的长度为多少,再用树状数组或前缀和统计在这长度以内加入了集合的有多少个就行了。 #include <bits/stdc++.h>using namespace std;const int maxn = 1300000;

2017-10-17 00:19:12 261

原创 k-palindrome

dp 用 f[i][j] 表示 i 到 j 之间最长的头尾回文串的长度,那么如果 a[i]==a[j] ,那么 f[i][j] = f[i+1][j-1]+1,否则f[i][j] = 0。注意如果 f[i+1][j-1] 的回文长度等于它本身的长度,那么f[i][j] = f[i+1][j-1]+2。这个式子可以自己画图看一下。小细节就是这里的枚举顺序要从短到长进行枚举。最后用树状数组或者前缀和进

2017-10-17 00:12:43 340

原创 Passwords

AC自动机上套dp 首先是通过给定的 blacklist 建立AC自动机,那么合法的 password 在生成过程中肯定不能经过任意一个结束点。于是在这个自动机上写状压dp,0~7用三位分别表示含有数字、小写字母、大写字母的状态的合法方案数。同时要注意一点,把所有不能经过的点标位不合法点,那么如果一个节点不合法,它的子树的所有节点都是不合法的,而且如果一个节点的fail指针指向一个不合法节点,那么

2017-10-17 00:03:05 492

原创 Iron and Coal

题意是 n 个点,m条有向边。其中有些点有资源a,有些点有资源b,从点1出发,最小花费多少代价能同时占据最少一个含 a 的和含 b 的。花费的代价为路径上的点数,注意不一定只能一条路径。 首先想路径主要分三类,1是去a和去b是两条不相交的路径,2是从点1出发到达某个分岔路分别到a和b,3是a和b的资源在一条路径上。于是原图需要做三次bfs,分别是点1到每个点的最短距离,后两次是有资源a的和属性b的

2017-10-07 20:49:31 594

原创 Airports

DAG 考虑一架飞机能完成任务 i 之后能赶去完成任务 j,那么就在这两个任务之间连一条线,最后求的就是最少链覆盖所有点,即DAG。实际上就是把每个点拆成 x,y, 上述就是把 ixi_x连接jyj_y,然后跑一次二分图最大匹配,最后总飞机数就是 m-solve(),因为每一次配对成功都可以省下一架飞机。 注意一个坑点就是这道题很显然要用floyd进行路径距离优化来判断飞机是否能在完成任务 i

2017-10-07 20:35:02 440

原创 Racing Gems

挺显然是个dp,但是状态应该怎么转移才是问题。考虑点 i 能够转移到点 j,必定是点 j 包含在点 i 的一个弧度角中。再转化一下,就是通过反向的投影,点 j 一定在点 i 的两端 于是我们将点向左投影进行排序,并且从大到小打上id 1~n,在这个偏序关系中,状态只能从编号小的转移到编号大的(即投影后横坐标大的能转移到横坐标小的);再将点向右投影并且从小到大排序,同理状态只能从前面的转移到后面

2017-10-07 20:25:47 266

原创 Salary Inequity

线段树 按照dfs序给每个员工进行标号,那么同一颗子树上的员工编号就是连续的数字,于是查询和修改都能转换成区间操作,套上线段树就好了。 #include <bits/stdc++.h>using namespace std;const int maxn = 1000010;const int maxx = 0x3f3f3f3f;struct Node { int x, y;

2017-10-06 10:23:39 232

原创 Pushups

每组数据给出m种得分方式,问做n个俯卧撑最多能得到多少分。 首先考虑只有得1分的,要做满5000个俯卧撑,最多是进行了100回合。所以极限也就只有100回合。于是进行动态规划,f[i][j]表示地 i 个回合,做 j 个俯卧撑,最多得到多少分,很容易就能推出后面的。最终答案就是max{f[i][n]} #include <bits/stdc++.h>using namespace std;co

2017-10-06 10:20:15 307

原创 Knights

矩阵加快速幂 假设我们考虑 m 为 4 的情况。由于马只能走日,所以能进攻的只有隔壁两列以内的,也就是说我要放置第i列的情况,只需要考虑第i-1和第i-2列的情况。那么就能转换成一个4*3的棋盘,第[1,2]列转换成第[2,3]列。每个状态最多是8个格子,也就是说状态数是282^8。利用dfs先预处理出哪些方案是合法的,同时生成转移矩阵,如果状态i能从状态j转移过来,那么a[i][j]=1,于是就

2017-10-06 10:14:05 197

原创 Matrix

矩阵中将其中一个元素替换成 p,求最大的子矩阵的值 首先是 O(n3n^3),枚举行号的上下界,同时维护每一列的和以及最小值,如果不考虑一定要修改,那么直接在维护的基础上做一次 O(n) 的 dp 就可以了。做一次修改的话就要同时维护进行了一次更改的值以及不进行更改的值,同理做dp。但是这里会有一个问题,有可能求出来的最大值是整个矩阵没有进行修改后的和。要解决这个挺简单的,就是记录一次更改的值要确

2017-09-24 10:40:06 157

原创 Territorial Dispute

凸包 首先如果点数小于等于2那么一定是不存在合法情况的 其次是如果所有点共线(并且点数超过3个),那么一定可以 然后做凸包,如果一共就三个点那么一定是不合法,否则就可以判断: 1、如果凸包点数等于n,那么采用 A B 相间的方法就行了 2、如果不等于n,那么凸包上的是A,凸包里面的是B就一定合法 #include <stdio.h>#include <stdlib.h>#includ

2017-09-24 10:29:33 331

原创 Minimum

给一个数组,有两种操作 1:求 x,y in [l,r],MinAx∗AyA_x*A_y 2:将 AxA_x替换值为 v 挺显然的线段树,分别求区间最大和最小值,如果区间最小值是正数,那么直接是这个数的平方。否则就要看看最大值,如果最大值是正数,那么就是最小值乘最大值(因为是负数),否则的话就是最大值的平方(因为出来是正数)。 #include <bits/stdc++.h>using na

2017-09-24 10:19:06 391

原创 The Dominator of Strings

ac自动机加优化 很显然这题就是建好ac自动机,然后我在建立的时候把count的值(每个字符串结尾计数用的),通过fail指针放在一起,那么如果最长的包含了其他所有的串,那么最后所有的count值都会汇聚在最长字符串的那条链上,扫一遍就可以了。 #include <stdio.h>#include <iostream>#include <algorithm>#include <string

2017-09-17 23:17:21 217

原创 Apple

第一次拿java过acm的题目~ 如果不考虑精度这题就是一道水题,直接求圆心然后判断是否在圆外 当然直接做由于精度会wa,用java的BigDecimal就可以完成了 import java.io.*;import java.util.*;import java.math.BigDecimal; public class Main { public static double x,

2017-09-17 18:15:17 228

原创 Maximum Flow

数位运算 把n拆成二进制 (1xxxxxxx) 形式,对于任意 i 拆成相同位数的二进制,如果最高位是0,那么一定是可以完全流完,因为 i xor n > i (i xor n 最高位一定是1),所以可以用求和公式来求。对于最高位是1,那么后面的位数就是相当于数位的运算,计算每一位的贡献。如果当前位为1,当且 i 的对应位为0时有贡献,维护一下很容易求出有多少个合法的解;同理当前位为0。 #in

2017-09-17 18:10:26 208

原创 Sum

由于 (1 <= x <= 1e6),x最多只有7位,考虑将 x 按数位来复制233次即可 即答案是(10…010…010..01)的形式 #include <bits/stdc++.h>using namespace std;int x, t;int main() { //freopen("input.txt","r",stdin); int T; scanf("%d

2017-09-17 18:04:20 168

原创 Our Journey of Dalian Ends

给定双向边,求Dalian到Shanghai再到Xian,途中不经过统一的城市,求最短距离 费用流 源点往Shanghai连边,城市进行拆点处理(流量为1,确保只经过一次),然后城市之间流量为1,费用为对应距离,最后Dalian和Xian与汇点连边,跑费用流。如果流量为2那么费用就是最小距离了。 #include <bits/stdc++.h>#include <map>using nam

2017-09-17 18:00:02 237

原创 E: number number number

E: number number number 比赛时我是直接找规律的 ans[i] = 3*ans[i-1]-ans[i-2]+1 然后矩阵乘法 后来听说是直接找第2n+3个斐波那契数 #include <bits/stdc++.h>using namespace std;#define ll long long/*const int maxn = 100000;int f[2

2017-09-10 18:20:03 402

原创 D:array array array

D:array array array 其实转换一下就变成了求最长不上升(下降)子序列 由于AiA_i<=10510^5,就用树状数组存就好了 每次查询小于等于 AiA_i 最长是多少,更新当前就好了 #include <bits/stdc++.h>using namespace std;const int maxn = 1e5+10;int f[maxn], a[maxn],

2017-09-10 18:05:28 490

原创 用 C# 写 TCP socket 连接

第一次用 C# 写 TCP 连接,求指点 和同学合作完成的期中project 最终是完成了一个聊天室首先利用封装好的 Windows.Networking.Sockets.StreamSocket 生产我的 clientsocket 通过后端给定的IP地址以及监听端口实现TCP连接 注意的是socket端要实现单例模式,因为用户的所有状态都是记录在 clientsocket 类里面,如果

2017-09-10 10:57:42 1535

原创 H: Skiing

H: Skiing 很显然是拓扑,用拓扑序做一次最长路就好了 #include <bits/stdc++.h>#include <vector>using namespace std;const int maxn = 10010;int q[maxn], f[maxn], a[maxn], n, m, l, r, ans, x, y, z;struct Node { int

2017-09-10 09:56:48 525

原创 G: Query on a string

G: Query on a string 给定字符串S和T,N次操作,包括修改 S 一个字符或者查询 S 中 [l,r],T 出现的次数 用树状数组就好了,因为 |T|<=10,每次用个数组记录,如果a[i]=1,代表 T 在 S 中出现而且结尾坐标为i,那么每次查询就相当于询问 [l+len_t-1, r] 中有多少个1,用树状数组维护就好了 #include <bits/stdc++

2017-09-10 09:53:06 669 2

原创 Longest Common Substring

HDU 1403 经典的后缀数组题目,把两个字符串合并,维护一下后缀数组就好了 #include <bits/stdc++.h>using namespace std;const int maxn = 200010;char ch[maxn], All[maxn];int SA[maxn], Rank[maxn], Height[maxn], tax[maxn], tp[maxn]

2017-09-08 15:02:51 387

原创 Flight Boarding Optimization

Gym - 100269F 暴力dp,f[i][k]表示前 i 个座位分了 k 次,总和最小是多少,可以从 f[j][k-1]转移过来,只需要预处理出 [j,i-1] 对 [i,s] 的影响就好了,用前缀和挺容易维护的。 #include <bits/stdc++.h>using namespace std;const int maxn = 1010;const int maxx = ma

2017-09-04 13:12:07 218

原创 Destroy Walls

HDU 6187 给定n平面点一级m条边连接这些点,问最少去掉多少条边,以及在这情况下去掉边的点权最少,使得整个图是一个连通图。 其实仔细想一下就能发现满足这个条件当且仅当这些围墙不存在环,就是剩余的边形成的只会是树或森林,所以做一遍最大生成树就好,其他的都去掉 #include<bits/stdc++.h>using namespace std;const int Len = 50001

2017-09-01 11:55:52 263

原创 Query on A Tree

hdu-6191 给定一棵树以及每个节点的权值,给定多组询问,每次询问在u子树中与x异或值最大是多少 离线+字典树 先离线把问题都放到节点中,然后dfs每个节点赋予dfs序,同时生成字典树,并记录当前节点最大的dfs序是多少,当回溯时,只要字典树的节点是大于等于当前节点的dfs序,那么都是这个节点的子树,对于每一个询问找到最大值即可 #include <bits/stdc++.h>#in

2017-09-01 11:50:23 244

原创 Teach Yourself Pottery

Gym - 100113E 给定圆台的一面的直径和法线长度,问最大体积 直接三分就好了。 #include <bits/stdc++.h>using namespace std;const double pi = acos(-1);double L, D, l, r, mid1, mid2, v1, v2, ans;double get(double x) { return si

2017-09-01 10:37:12 159

原创 Airlines — 2

Gym - 100113B 题意要时n个点之间的所有连边染色,使得不存在相同颜色的边组成一个奇环。 分治,对于一个n个点的,我们可以把它分为 (1, mid) (mid+1, n) 两部分,和二分图一样,并且两边相互连相同颜色的边,这样这种颜色的边肯定不存在奇环,然后对于两边再分别这样递归下去,最后答案是logn的。 #include <bits/stdc++.h>using namesp

2017-09-01 10:34:30 173

原创 Schedule

HDU - 6180 显然是先排序,然后按左端点从小到大放进去,每次在剩余的机子中找一个符合条件而且尽量大的。 但是一开始用 multiset 和 lowerbound 来进行处理会超时,就想到另一种写法。用一个优先队列和一个栈,对于当前任务,先将优先队列的所有合法情况按顺序压到栈中,直到不存在合法的机器,然后从栈找是否有满足条件的,如果没有就要增加机器 #include <bits/st

2017-08-31 10:41:15 135

原创 Free from square

HDU - 6125 从 1-n 选出不超过 k 个数,使得所有数乘积不能被任何平方数整除。 一开始算了一下500以内的质数,还是挺多的,但是注意到 500−−−√\sqrt{500} 中的素数只有8个,那么就可以做装压dp了,对于含有超过 500−−−√\sqrt{500} 的素数,进行因式分解,并且把拥有相同超过 500−−−√\sqrt{500} 的质数放在一起(肯定最多只有一个),然后

2017-08-23 23:55:48 247

原创 Inverse of sum

HDU - 6128 现场的时候并没有想到,通过化简式子得到 a2i−aiaj+a2j=0a_i^2-a_ia_j+a_j^2 = 0,尝试在左右都乘以(ai−aj)(a_i-a_j),得到a3i=a3ja_i^3=a_j^3,于是就相当于把aia_i中的所有的数算个三次方,计算一下排列组合就好了。但是注意到乘的是(ai−aj)(a_i-a_j),如果ai=aja_i = a_j那么后面的等式

2017-08-23 23:48:08 191

原创 Hard challenge

HDU 6127 给定n个点,每个点有权值,两两之间连线不过远点,现在要一条过远点的直线把点分成两个集合,使得两边的和的乘积尽量大。 这题直接极角排序,然后枚举每个点,维护对面的点就可以了,复杂度为nlogn。 唯一要注意的就是枚举的点可以属于两边中的任意一边 #include <bits/stdc++.h>using namespace std;const int maxn = 500

2017-08-23 20:53:49 236

原创 RXD and dividing

HDU 6060 给定一棵树,节点2..n划分成k个集合,求所有({1} U Si)的最小生成树的路径和。 一开始想着如何划分,后来想一想算每条边的贡献比较简单,以1为跟dfs一次计算每棵子树的大小,如果子树比k大,那么这条边的贡献为 x*k, 否则为 x*f[i],(f[i]为子树大小,x为边权)。因为一颗子树下的点分配到至多k个集合,每次贡献不会超过k次。 #include <bits/

2017-08-22 11:11:45 181

原创 Kanade's trio

HDU 6059 求有多少对(i < j < k),满足a[i] xor a[j] < a[j] xor a[k]。 一开始想着就是枚举j,维护两颗字典树G、F,分别记录[1,j-1] , [j+1,n]的数(二进制)以及出现的次数。对于每一次查找一开始没想好,先试试直接深搜,即每次找前面都相同的,当前值会使得产生a[i] xor a[j] < a[j] xor a[k]形式的进行相乘算

2017-08-20 10:12:34 275

原创 Inversion

HDU 6098 线段树加优化 一开始妙想的就是线段树,时间是nlognlognnlognlogn的,就是很无脑地计算每一段区间的最大值然后算出每一个BiB_i,但是超时了。在这个基础上加优化,注意到每一个合数,他的答案就是其每一个因数的答案的最大值,画一下就能看出来,加上这个就过了。 #include <bits/stdc++.h>using namespace std;const

2017-08-20 09:31:59 198

matlab教程

包含了matlab的许多基本操作以及使用方法,适合新手学习使用

2018-07-14

空空如也

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

TA关注的人

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