
数据结构与算法
wangtaoking1
这个作者很懒,什么都没留下…
展开
-
UVa 103.Stacking Boxes
dp,盒子嵌套问题。用edge【i】【j】二维数组来记录盒子i 能够嵌套到盒子j 中。在判断能否嵌套时,先将每个盒子的各个数据按从小到大排序,然后再逐项进行比较,如果每个数据都较小,则该盒子可被后者嵌套。用dp【i】表示从盒子i开始的最长盒子串。最后打印出最长盒子串时打出字典序最小的即可。 #include #include #include #include #i原创 2012-02-23 13:39:50 · 599 阅读 · 0 评论 -
UVa 10306. e-Coins
题意为有m个向量,将任意个向量相加使得距离刚好为s,求向量的最小个数。看题后的第一想法是用广搜+dp,后来提交代码却RE了(应该不会的)。后来用枚举试了一下,还是RE。所以才想到是不是数组开小了一点,于是将数组开大了一点,结果果然AC了。其实广搜+dp应该更快的,而且空间复杂度也较小。 广搜+dp:#include #include #include #include #i原创 2012-03-08 11:53:08 · 946 阅读 · 0 评论 -
UVa 10271. Chopsticks
题意为用n个数据,要从中选出k+8个三元组(x,y,z,其中x考虑动态规划,那么很容易想到如下的状态定义:dp[i][j]表示用前j个数组成i个(x,y,z)数对的最小消耗。 考虑状态d[i][j]:对于x和y,有如下考虑:对于a[j],如果不使用a[j],那么d[i][j]=d[i][j-1];如果使用a[j],那么就和a[j-1]一起使用,d[i][j]=d[i-1][原创 2012-03-09 10:04:20 · 1174 阅读 · 0 评论 -
UVa 10154. Weights and Measures
题意:有几只乌龟,每只乌龟有一定的重量与力量。每只乌龟可以背小于它力量的重量(包括它自身的重量)。问最多一共可以有多少只乌龟叠在一起。可以证明,将力量大的乌龟放在下面可以得到一个更优的状态。因此在dp之前应先将所有乌龟按力量大小排好序,力量小的在前面。(证明可见这个网页)1.用dp[i][j]表示从前 i 只乌龟中选出 j 只可以得打的最小总重量。转移方程为:如果dp[i-1][j-1原创 2012-03-09 20:30:39 · 1576 阅读 · 0 评论 -
sicily 1444. Prime Path
这题比较简单,用一个广搜就行...要将状态标记是否被访问,不然会超时...#include #include #include using namespace std;struct num{ int n,c; num() {} num( int a,int b) { n=a; c=b; }};bool prim原创 2012-01-26 17:38:41 · 1154 阅读 · 0 评论 -
Sicily 5232.Flood
本题为2012年校赛第一题。题意为给出若干个矩形,每个矩形给出左下角和右上角坐标,以最小x和y作为整体区域的左下角坐标,以最大x和y作为整体区域的右上角坐标,矩形区域内不被水淹,水从周围冲来,四周都有保护区域的也不被水淹,连在一起的安全区域算一块,求出安全区域的块数。在比赛时很遗憾因为这题没做出来,所以没能进省赛。比赛完看题解,说这题用离散化,其实在比赛时有想过离散化,但是没想出来原创 2012-04-10 01:26:58 · 904 阅读 · 0 评论 -
sicily 1802. Atomic Nucleus Investigation
一系列操作,分别进行增加数据M,移除数据M,查询两两之间的最小距离。( 1建一棵1-100000的线段树,每个节点包含l, r, x, y , v,其中l,r分别表示左端点和右端点,x和y分别表示左子树的最大值(无数时为0)和右子树的最小值(无数时为Max),v表示改线段中最小的距离。给该数提供add,remove操作。 还必须添加一个数组vis来表示每个数是否在树中存在。 t[p].v原创 2012-03-27 22:24:55 · 747 阅读 · 0 评论 -
sicily 4834. Party Location
已知在平面上有若干个点,求一个已知半径的圆最多更覆盖多少个点。一个比较经典的问题。(另一个为已知若干个点,求能覆盖住所有点的圆的最小半径。)两两点枚举,分别以两点为圆心,已知半径画圆,若相交,则求出两圆的一个交点(两边可任意,但是每两个圆的交点都要取同一边的),然后判断以交点为圆心已知半径为半径的圆能覆盖多少个点(在圆上也算)。逐个更新ans,直到枚举完全,最后ans的值即为能覆盖住的点的原创 2012-02-25 22:59:06 · 725 阅读 · 0 评论 -
sicily 1800.Sequence
求一个序列的长度在L-U的子序列和的最小值。才刚学线段树,所以第一次建树是用线段【a,b】表示序列中a到b的元素和,结果TLE了。后来看了网上题解后才知道要用线段【a, b】表示从0到x(a用S【i】-max就得到了要求的最小子序列和了。 #include #include#include#include#define Max 32800#define max(a,原创 2012-03-27 14:59:20 · 726 阅读 · 0 评论 -
UVa 10192. Vacation
本来很简单的一道dp题,可是却WA了三次,后来将输入语句改成了getline( cin , s);就AC了,题目也没说可以有空格啊,真是的... #include #include #include #include #include #include using namespace std;int dp[105][105];string s1,s2;int main(原创 2012-02-26 00:40:25 · 1352 阅读 · 1 评论 -
全排列生成算法:next_permutation
全排列生成算法:next_permutation转载 2015-06-25 11:16:01 · 824 阅读 · 0 评论 -
Works Applications2016校园招聘 — Travel Information Center
Works Applications2016校园招聘 — Travel Information Center原创 2015-09-26 21:59:45 · 5127 阅读 · 1 评论 -
连连看——网易游戏2016实习生招聘
网易游戏2016实习生招聘——连连看原创 2015-04-14 00:32:42 · 1581 阅读 · 0 评论 -
UVa 10304. Optimal Binary Search Tree
题意为给出一组从小到大的数据的频率,要求建一棵二叉查找树,使得总的cost最低。TotalCost= PathLength【i】*fre【i】+...;题目较简单,一下就看出了状态和转移方程。 开始用记忆化搜索做,最初没有想到将所有任意两个数之间的数的和都求出来保存起来,而是在每一次dp时都去求一次,结果提交后用了6.952s,真是慢死了。然后就想到了在dp之前就应该把和用一个数组存原创 2012-03-06 11:22:11 · 1011 阅读 · 0 评论 -
UVa 10739. String to Palindrome
题意为给出一个字符串,现在可以进行3种操作(添加字母,删除字母,替换字母),将其变成回文串,求出最少的操作次数。这题虽然想到了状态表示,但是在转移方程上遇到了点麻烦,最后还是看了别人的题解。现在越来越不会独自思考了,老是不会就看题解,这样不行啊。由于添加字母和删除字母的效果是一样的,因此我们这里就只进行删除和替换操作。用d【i】【j】表示将第i到j之间的字串变成回文串的最小操作步数,然原创 2012-03-06 11:35:27 · 1261 阅读 · 0 评论 -
sicily 1197. Hotel
dp问题:key[1..i] 与 w[1..j] 是否匹配?用状态f【i】【j】记录:状态转移方程如下:f【i】【j】= f【i-1】【j-1】 if key【i】== ‘?’原创 2012-02-23 11:33:32 · 650 阅读 · 0 评论 -
UVa 674.Coin Change
经典dp问题,用记忆化搜索或者用递推(滚动数组)均可实现。 用滚动数组如下:#include #include using namespace std;int n;int f[7490];int a[5]={1,5,10,25,50};int main(){ int i,j; for(i=0;i<7490;i++)f[i]=1; //只由1组成均原创 2012-02-24 11:22:53 · 1489 阅读 · 1 评论 -
UVa 10405.Longest Common Subsequence
很简单的一个dp问题。用f【i】【j】表示s1的前i个字母和s2的前j个字母的公共最长子串,状态转移方程如下:f【i】【j】 = f【i-1】【j-1】 +1, if s1【i-1】==s2【j-1】 max( f【i-1】【j】,f【i】【j-1】), if s1【i-1】!= s2【j-1】原创 2012-02-24 00:55:26 · 567 阅读 · 0 评论 -
UVa 10003.Cutting Sticks
本题大意为在给出的n个结点处切断木棍,并且在切断木棍时木棍有多长就花费多长的代价,将所有结点切断,并且使代价最小。开始在做时没有多想就开了一个1000*1000的数组,自己测试随便一个数据都可以,但是提交后却TLE了,估计是该题的测试案例相当多吧,不然也不会超了。后来在网上看了一下别人的答案,才猛地发现只用开一个50*50的数组就可以dp了,后来改了之后就AC。 #include原创 2012-02-24 21:30:54 · 1112 阅读 · 0 评论 -
UVa 562. Dividing coins
题目大意:有一堆各种面值的硬币,将所有硬币分成两堆,使得两堆的总值之差尽可能小。开始看到题目竟然很久都找不出状态和状态转移方程,几天没做题脑袋就生锈了。申请一个dp【50001】来记录该币值能否取得,可以当成0-1背包做。然后从sum/2开始往下遍历,直到第一个标记为1的币值结束,再算一下即可。 #include #include #include #include #in原创 2012-02-28 12:56:21 · 1630 阅读 · 0 评论 -
UVa 348. Optimal Array Multiplication Sequence
本题就是矩阵连乘,只是加了一个路径打印。开始在路径打印上一直没找到规律,最后看了别人的代码才恍然大悟,其实仔细想想也挺简单的。用一个数组记录下每次断开的具体位置,然后再用递归打印出具体步骤即可。 #include #include #include #include using namespace std;int dp[11][11],p[11][11],row[11]原创 2012-02-28 13:51:55 · 943 阅读 · 0 评论 -
UVa 624. CD
这道dp题做了很久,如果只是输出最大值就很简单。 是一个0-1背包问题,只是体积和价值相等而已。本来没用多久就把路径打印出来了的,只是在最后一组测试数据上跟答案有点不同,因为该数据存在两种方案。题目也没说,所以就一直纠结着怎么输出答案的方案。后来还是将原来的代码交上去了,没想到竟然是在宥多种方案时随便打印一种即可的。 #include #include #include原创 2012-02-29 00:35:18 · 1422 阅读 · 0 评论 -
sicily 1264. Atomic Car Race
//简单的dp//由于换胎后相当于又从原点开始跑,所以在计算直达所需时间时可以优化#include #include #include using namespace std;int main(){ int n,an[101],r; double b,v,e,f,dp[101],cost[10001]; //cost[i]表示换胎后(或从起始点)行驶距离i所需时间 whi原创 2012-02-20 20:58:54 · 1063 阅读 · 0 评论 -
UVa 531. Compromise
题目意思是找两个序列的最长公共子序列,并将其打印出来。题目难点就在于如何将公共序列打印出来。 法1:此处不能仅通过dp【i】【j】 ==dp【i-1】【j-1】+1就判断s1【i】在公共序列,应先将其他情况排除之后才能判断。#include #include #include #include #include using namespace std;int dp原创 2012-02-29 20:14:13 · 1053 阅读 · 0 评论 -
UVa 10404. Bachet's Game
题意为给出总石子数n,和m堆石子,两个人轮着取石子,每次只能从总石子中取m堆中的一堆的个数的石子,取走最后一个石子的胜。S先取,O后取。用状态f【i】表示还剩i个石子时S的胜负。当为1时表示S能胜,反之则负,即O胜。转移方程为当 i -r[j]>=0而且f【i - r[j]】=0(0 #include #include #include #include #include u原创 2012-02-29 23:01:57 · 1484 阅读 · 0 评论 -
UVa 437. The Tower of Babylon
题意为输入若干种立方体(每种若干个),然后将立方体堆成一个塔,要求接触的两个面下底面的长宽分别严格大于上底面,求塔的最大高度。将每种立方体的各种摆放形式均视为不同的立方体,并存起来。再将所有立方体按照下底面的面积从小到大排序(因为在塔上面的立方体的底面积一定比下面的小),然后只需求该序列的最大上升子序列的长度即可。 #include #include #include #incl原创 2012-03-01 00:34:56 · 2327 阅读 · 0 评论 -
UVa 10534. Wavio Sequence
这题是要找一个最长(假设长度为2N-1)的子序列,使得前N个元素递增,后N个元素递减。开始看了半天也不知道怎么定状态和转移方程,后来突然才想到可以用两个状态,一个找从前到后的上升子序列,另一个找从后到前的上升子序列(此时用的O(n^2)的复杂度找的)。最后扫一遍,取两个状态之中较小的,即可找出最长的先上升后下降的子序列。 可是提交答案后TLE了。 知道肯定是找最长上升子序列时太复杂了,但是想了原创 2012-03-02 21:31:41 · 2261 阅读 · 0 评论 -
UVa 10051. Tower of Cubes
题意为一些重量递增而且各个面都有颜色的立方体,要将这些立方体堆成一个塔,要求两个接触面同色,而且下面的立方体更重。求塔的最大高度。这题其实比较简单,就是数据太多,处理起来比较麻烦。将每个立方体都分解成6个不同面朝上的立方体,这里只需将立方体的上下两面颜色和重量记下就行,然后再dp,在打印路径时递归打印即可。#include #include #include #include原创 2012-03-03 14:44:14 · 1268 阅读 · 0 评论 -
Works Applications2016校园招聘 — Game
Works Applications2016校园招聘 — Game原创 2015-09-26 20:58:20 · 9594 阅读 · 14 评论