自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 poj-1159题解

题目大意:给定一个字符串,求最少插入多少个字符,可将其变成一个回文串。 思路:所谓回文串,即原字符串与翻转之后的字符串完全一致。设题目中给定的字符串为stra,  将其翻转之后为字符串strb, 题目的意思为最少插入多少个字符使得stra与strb互为回文串 。如果反过来思考的话,问题可以转化为:若stra与strb拥有公共的字符串越多,则仅需要插入哪些不同的字符即可满足条件,于是问题进一

2011-11-08 01:03:41 397

原创 poj-1088题解

题目大意:RXC大小的矩阵格网,每一格都赋有高度值。现从某一格出发,严格往低处走(即往高度减小的方向走),求满足这样条件的最长路径。 思路:1.很容易想到,从任意一个格出发都有4个方向(边缘处除外),即能求出多条路径,但最大值只有一种。            2.若从A点出发,需要经过B点,那么A点对应的最长路径中包含B点对应最长路径,即存在最优子结构。因此,最终的思路可以确定为

2011-11-08 00:00:04 309

原创 poj-1050 题解

题目大意:给定一个N*N的矩阵,求元素和最大的子矩阵,输出该值。 思路:这道题按照常理会计算任意元素为起点的任意大小的子矩阵的和,共有N*(N+1)/2的平方种情况,暴力搜索必定超时。仔细分析可以发现,若某些子矩阵元素计算得到其和为负数,那么就不必考虑包含此子矩阵的其他更大一些的子矩阵。由此想到使用动态规划算法,当从左到右扩展子矩阵大小时,随时记录当前子矩阵的元素和,根据其和的正负来判断是

2011-11-02 01:10:15 550

原创 USACO:Score Inflation解题报告

思路:完全背包问题,DP状态转移方程,一维的:f[j] = max(f[j],f[j-time[i]]+score[i])  /*ID: xpli1PROG: inflateLANG: C*/#include #include #include #include #define max(a,b) (((a) > (b)) ? (a) : (b))

2011-03-18 19:00:00 293

原创 USACO:Agri-Net解题报告

思路:最小生成树,prim算法解.  /*ID: xpli1PROG: agrinetLANG: C*/#include #include #include #define max(a,b) (((a) > (b)) ? (a) : (b))#define min(a,b) (((a) #define INT_MAX 0x7fffffff#d

2011-03-18 14:22:00 321

原创 USACO:Bessie Come Home解题报告

思路:很简单的最短路径问题,dijkstra即可解。本题规模很小,也可用floyd-warshalll来解。唯一需要注意的一点是:两个节点之间可能有多个不同权值的路径连接,输入的时候注意判断只取最小的那个权值。  /*ID: xpli1PROG: comehomeLANG: C*/#include #include #include #define ma

2011-03-17 14:40:00 298

原创 USACO:Cow Tours解题报告

思路:先用floodfill得到各连通区域,然后用floyd-warshall得到各连通区域中各点间的最短路径,最后枚举连接不在同一连通区域中的两点并计算新的直径。需要注意的是:通过这样连接得到的直径也许不是整个牧场中最远两个牧区的距离,因为它有可能比期中某个子连通区域的直径小,即最远距离的两个牧区可能就在连接之前的某个连通区域中,因此在最后需要和每个连通区域中的最远距离比较从而得到最终结果。

2011-03-16 21:11:00 434

原创 USACO:Overfencing解题报告

思路:Dijkstra求最短路径,然后对于同一出发点求到两个出口之间的较小者,最后对于所有出发点求一个最大值,即所谓的worst point.当然这题在空间上需要优化,用堆来优化是一个可行的办法。其实用一个unsigned char型的数组来记录每两点间距离就可以保证恰好不超空间。当然,网上说可以用floodfill可以更容易得到答案。  /*ID: xpli1PROG: ma

2011-03-08 18:58:00 290

原创 USACO :The Tamworth Two解题报告

思路:根据题目意思模拟牛和农民的运动过程即可,关键的难点在于判断无法相遇的情况。由于格网大小固定为100x100,而运动的方向有4种,所以牛和农民在格网中所处的位置状态最多不会超过 4x100 x 4x100 = 160000种,所以只需判断总共移动的时间是否超过160000分钟即可判断是否存在死循环。 /*ID: xpli1PROG: ttwoLANG: C*/#

2011-03-04 23:53:00 280

原创 USACO :Fractions to Decimals解题报告

思路:模拟除法. 判断循环节的条件是出现相同的余数 。这题让我认识到string的加减法多么的耗时间 /*ID: xpli1PROG: fracdecLANG: C++*/#include #include #include #include using namespace std;#define IN    fin#define OUT

2010-07-01 16:28:00 285

原创 USACO :Money Systems解题报告

背包DP,若定义dp[n][k]为用前k种货币组成n的方法数,则状态转移方程为:    dp[n][k] = dp[n][k-1] + dp[n-c_k][k],其中c_k为第k 种货币的币值。即:前k种货币组成n的方法数 = 前k-1种货币组成n的方法数 + 前k种货币组成n-c_k的方法数关键需要理解的地方是:dp[n-c_k][k] 包含了 dp[n-i*c_k][k]所有的方法

2010-06-25 10:58:00 322

原创 USACO :Zero Sum解题报告

相邻数字之间只有‘ ’,‘+’,‘-’三种可能,故当N=9时,最多只有3^8种情况。可以DFS,也可以采用三进制数来枚举,怎么也不超时。/*ID: xpli1PROG: zerosumLANG: C++*/#include #include #include using namespace std;#define IN    fin#define O

2010-06-24 17:05:00 388

原创 USACO :Cow Pedigrees解题报告

也是一道dp,思想是:节点数为i,深度为k的树的个数 = 节点数为j,深度为k1的树的个数 乘以 节点数为i-j-1,深度为k2的树的个数, 其中k1,k2可有节点数确定范围。dp的方程式为:dp[i][max(k1,k2)+1] += dp[j][k1]*dp[i-j-1][k2];  /*ID: xpli1PROG: nocowsLANG: C++*/#incl

2010-06-24 15:43:00 238

原创 USACO :Longest Prefix解题报告

一维的dp,设dp[i]表示主串S中从i开始的最长的可组成的前缀,dp[1]就是所求,状态转移方程:{dp[i]=max{dp[j]+j-i} 其中:i 到 j-1 的字串是属于集合P 且 j 要满足 iUSER: li xiaopeng [xpli1]TASK: prefixLANG: C++Compiling...Compile: OKExecuting.

2010-06-24 14:25:00 281

原创 USACO :Party Lamps解题报告

暴搜必定超时,这道IOI的题有两个优化技巧:1.根据4个开关的特性,每隔6盏灯状态必定是一样的。因此只需考虑前6盏灯即可。2.由于每个开关按奇数次等于按一次,按偶数次等于没按。因此每个开关只需考虑按或者没按两种状态。4个开关共枚举16种情况即可。两个判断是否得解的条件:1.枚举按开关的次数必须大于给出按的开关总次数C,且奇偶性相同(仔细想想就知道怎么回事) 2.与给出的一些灯的状态匹配

2010-05-12 13:30:00 284

原创 USACO :Runaround Numbers 解题报告

从M+1开始逐一判断是否是循环数,用数组来维护数的各个位数,可剪枝掉含0的数以及含重复数字的数。 /*ID: xpli1PROG: runroundLANG: C++*/#include #include #include   #include #include using namespace std;#define OUT fout#def

2010-05-12 13:24:00 312

原创 USACO :Subset Sums 解题报告

方法一: 1.N(1 2.划分后子集和为subsum,则dfs搜索其和为subsum的情况? 超时方法二: 若f[i][j]表示在前i个数中选取若干个数其和为j的方案数, 则状态转移为: f[i][j]=f[i-1][j]+f[i-1][j-i]  (j-i>=0)      即:当i f[i][j]=f[i-1][j]              (j-i 即:

2010-05-12 13:22:00 723

原创 USACO :Preface Numbering 解题报告

1.统计N以内(1,2...9) (10,20...90) (100,200,...900) (1000,2000,3000)出现的次数2.然后再统计I V X L C D M的次数 /*ID: xpli1PROG: prefaceLANG: C++*/#include #include #include   #include #include

2010-04-24 21:20:00 353

原创 USACO :Hamming Codes 解题报告

数据小,暴力搜索可以搞定。但是推荐使用DFS,每个节点(数)有取与不取两个分支。注意: 0是必须出现的。证明如下:最终得到的结果序列中,0是必须出现的,证明如下:如果存在另一个满足要求的结果序列S={a1...an},其最小值为a1 = N > 0,那么序列S' = S ^ N 是满足条件的最小解,且首元素为0/*ID: xpli1PROG: hammingLANG

2010-04-23 16:50:00 473

原创 USACO :Healthy Holsteins 解题报告

方法一:对于每种饲料,只有两种选择:喂或者不喂。所以最多只能有2^15种方案,简单的枚举就可以了。 方法二:基于方法一的DFS,DFS树的每一层为某一种饲料喂与不喂两个分支。方法三:我使用的是ID-DFS(迭代加深搜索),树的第k层表示喂了k种饲料。针对题目要求所喂饲料种类最少,每次DFS限定深度k,若搜索到可行解,那必定是最优解。当然,也可以用BFS,但太占空间。 /*ID:

2010-04-21 18:46:00 592

原创 USACO :Sorting a Three-Valued Sequence解题报告

一道很简单的贪心,在输入的时候统计共有几个1、2、3。设想排序后,数列分为1...1 2...2 3...3三个部分。因此对于原数列可以先交换1部分中的2和2部分中的1,交换1部分中的3和3部分中的1,交换2部分中的3和3部分中的2。最后就只剩下 2 3 1或者3 1 2这两种乱序中的一种,其实此时只需统计1部分中还剩多少个2或者3的个数,乘以2倍即为交换2 3 1或3 1 2的次数。/*

2010-04-21 12:32:00 210

原创 USACO :Ordered Fractions解题报告

水题,枚举加快排,注意舍弃分母和分子可以约分的情况。此外,还有一种类似杨辉三角的数学方法:    可以把0/1和1/1作为“端点”,通过把两个分数的分子相加、分母相加得到的新分数作为中点来递归(如图) 0/1                                                              1/1

2010-04-20 13:40:00 380 1

原创 USACO :The Castle解题报告

      这是道floodfill题,用DFS对每个square扩展很容易得到room的个数以及面积大小。square扩展时用到位运算,每次扩展到下一个square,应将扩展的入口堵住,避免重复扩展甚至死循环。然后枚举打开每一堵墙(最外围的墙除外),当墙两边不属于同一个房间且面积之和最大时即得解。为了避免排序,应从西向东,从南向北的顺序枚举。/*ID: xpli1PROG: castleLANG

2010-04-19 20:18:00 457

空空如也

空空如也

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

TA关注的人

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