自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(34)
  • 收藏
  • 关注

原创 UVA - 1267(贪心)

先根据根服务器位置,将五根树转换为有根树,然后,每次深度最大的未被覆盖到的节点,选其k级祖先做服务器、证明,就是假设法。#include #include #include #include #include #include #include #include #include using namespace std;typedef long long LL;#de

2015-03-31 22:00:30 397

原创 UVA - 1484(树形dp,最大值最小值同时维护)

#include #include #include #include #include #include #include using namespace std;#define rep(i,n) for(int (i)=0;(i)<(n);(i)++)#define rep1(i,n) for(int (i)=1;(i)<=(n);(i)++)const int maxn

2015-03-31 15:56:58 391

原创 UVA 10671 (dp 时间的转化)

首先,要正向dp以d(i,j) 代表从i,j到终点的最少耗时,是不可行的,因为这样并不知道最终到达终点的耗时,是否在规定时间内。那么自然想到加上一维表示已经耗时多少。但这里时间并不一定是整数,需要放大,注意到每次的时间为 L*60/V;  v又是5的倍数,所以 只需对分子分母同放大 2520。那么第三维上限为 2520*20;这样变可行。还有看别人代码,用60先与v进行约分,发现分母剩下

2015-03-30 07:42:00 385

原创 codefoce 297 - E(中途相遇法)

这题目用中途相遇法解太经典了,先暴力存下前一半的所有解。然后暴力匹配下一半的解。用map做中间者,#include #include #include #include #include #include #include #include using namespace std;typedef long long LL;#define rep(i,n) for(int

2015-03-27 13:34:41 510

原创 UVA - 11578(背包类dp)

首先,要对所有的要求,先按时间排序。然后只需对每一步若当前的要求和下一个时间相同,那么把他们两个同时安排,不同,则只安排当下的这个要求,选择有两种1,2#include #include #include #include #include #include #include #include #include using namespace std;typedef uns

2015-03-25 21:20:06 415

原创 UVA - 11782(背包式树形dp)

这题目的意思好难读,直接无语,原来最佳切割,要保证所有的叶子都被切掉。直接背包就行,d[ i ] [ j ] 代表编号为i的节点用最多为j个点对其所在子树形成的最佳割。#include #include #include #include #include #include #include #include #include using namespace std;t

2015-03-25 19:58:22 451

原创 UVA -10688(区间dp)

比较水的思路dp ,直接用d[ i ] [  j ] 代表最优解,那么枚举所有可行点,d[ i ][ j ] = max{ d[ i ][ p-1 ]+d[ p+1 ][ j ] +( k+p)*(j-i+1)  };#include #include #include #include #include #include #include #include #includ

2015-03-25 15:04:59 388

原创 UVA - 10981(dp ,map做内存类,仍没算出最大内存)

直接用map暴。#include #include #include #include #include #include #include #include #include using namespace std;typedef unsigned long long LLU;typedef long long LL;#define rep(i,n) for(int

2015-03-25 13:42:32 394

原创 UVA - 11691(dp 集合类)

这个题目的意思,就是给每种过敏物质最少一天的独立观察时间。直接d(s,i)代表当前已经选的集合s下,留下i天供交叉用。#include #include #include #include #include #include #include #include #include using namespace std;typedef unsigned long long

2015-03-25 08:45:46 355

原创 UVA - 10304(最优二查搜索树 dp)

本题目,第一开始想到了三维的状态方程即d(i,j,k)表示i 到j以到 根节点为k的距离构成的最优二叉树,当然加上状态转移必定超时。后来意识到某一段区间的最优二查搜索树不论其到根的距离k为何值,最优形态不变。这样可以用二维d[i ] [ j ] 表示这一段的最优解。d[ i ] [j ] = max(sum( i,j ) - f( k ) +dp( i,k-1 )+dp(k+1,j));

2015-03-25 07:41:46 464

原创 UVA - 11600(dp,并未真正解决)

首先总结一下思路,要从起点所在已经遍历的联通分量出发,到达为遍历的联通分量(记为共k个点),需时间为 平均需要时间为n-1/k ,因为一次出发走到未被联通点的概率为k/(n-1);然后就可成功转移到其他状态,而不会出现环。把每个联通分量都抽象为一个点,每个的人数等于所在联通分量的人数。但是直接用map 存状态,并未改变状态上限 (2^30) ,如 若有 30 1  2 3 这样的数

2015-03-24 20:37:56 447

原创 UVA - 10618(条件复杂的简单dp)

这个dp 没什么可说的,状态很容易想,只是有两个地方容易出错,就是从当前位置进行转移,合法性的判断(特别注意 当右脚在左面,这这时候左脚是可以tap的)。第二个,就是计算得分。千万注意啊。#include #include #include #include #include #include using namespace std;#define rep(i,n) fo

2015-03-24 16:26:13 460

原创 UVA 10604(进制式dp)

直接最多有6中化学药物。那么每种最多为10,且要表示改位存在要加1,采用十二进制,最大值在3000000左右,又可用状态比较少,使用记忆花搜索。#include #include #include #include #include #include #include using namespace std;const int maxk = 3501000;int d[max

2015-03-24 10:33:33 334

原创 UVA live - 4327(滑动队列优化dp)

方法同上题,对于每一层而言 d[ i ][ j ] 的最优解为max(d[I-1 ][j] , L(I,j),R(i,j));其中L(i,j)代表从i,j往左走若干位置的最优解。在这里只讨论L(I,J)的求法。L(i,j) = max( f[i-1][k] -sum[k] ) +sum[j];(其中dist(i,k)#include #include #include #

2015-03-23 21:33:28 372

原创 UVA - 1427(经典滑动队列优化dp)

首先,要说明滑动队列优化的情形,必须是当前位置前或者后面的一个连续区间的一个和 j 相关的func值。维护的队列为一个相对有保留价值序列,如本题维护的是func值上升而里该节点的远度下降(这也是func较低而又保留价值的原因)。#include #include #include #include #include #include #include using namesp

2015-03-23 20:21:50 513

原创 UVA 12260 (思路dp)

本题因为是博弈性质的dp 拼的就是思路,首先,咱们来看petra的策略。他只取当前最大,且存在多个最大取y值最小的那个。那么对所有的价值先按x降序排列,再按x升序排列。那么petra肯定从头一个个的取。再来看牌jan,他采取的策略是总体最优的由于前i个他最多只能取(i+1)/2 个,如前两个只能取到一个。所以以d(i,j)代表当前在i位置,要取到j个值得最优解。d( i,j ) = m

2015-03-23 12:51:00 328

转载 string 查询字串

// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "string" #include "iostream" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { strin

2015-03-22 09:48:46 434

原创 UVA -2232(并查集 + 位运算)

首先,说些关于异或的信息,异或满足交换律和结合律,这为用并查集创造了条件。又有 a^b= x, b^c=y; a^c=x^y; 本题目有三种操作,两种存,一种查。对于建立并查集时候要维护两个信息,第一个就是当前节点和root异或的值,当前集合是否存在已知量(之需要确保根部知道这个情况就可以,一个集合里有一个一致,那么该集合任一元素都可以通过异或得到)查的时候分为两种情况,第一种该元

2015-03-19 17:03:22 409

原创 ZOJ 3261 (并查集+离线算法)

本题正方向求解十分困难。但倒过来就变成了普通问题。这就是离线算法的好处之一。只是在联合不同节点时候要总以节点能量最大且编号尽量小的做根节点。#include #include #include #include #include #include #include #include #include using namespace std;#define rep(i,n

2015-03-18 19:46:12 673

原创 HDU---3038(并查集好题)

对于x - y 的和为z认为y 比 (x-1)大z。即对 x-1 和 y 建边构造并查集并维护每个点到其父节点的Sum值、#include #include #include #include #include #include #include using namespace std;typedef long long LL;#define rep(i,n) for(i

2015-03-18 13:45:34 434

原创 #296 -- D(转换思路)

本题求特殊条件下最大完全图的节点个数。转化成贪心问题。求不相交子区间的最大值。#include #include #include #include #include #include #include using namespace std;typedef long long LL;const int maxn = 201000;int cmax(int& a,int

2015-03-18 09:07:06 373

原创 #296 --- C ( set可以这么好用)

本题可简化为在一个区间内不断添加不同的点,求相邻两点最大距离为多少。竟然不知道,multiset删除元素时候,只删除一个同值元。#include #include #include #include #include #include #include using namespace std;set w,h;multiset wws,hs;void In(set& s,

2015-03-18 07:54:29 490

原创 UVA - 818(暴力+分析)

本题虽然解题方法简单,但是一直wrong了很多遍。首先,要用最少的open来拼成链状,直接暴力枚举(2^n)种可能性,每种的判断,是关键,首先把这些open的环拿出,剩下的不能有环而且不能存在度数大于2的节点。最后一个条件就是,剩下的联通分量要不超过open环个数加1。剩下就是暴了。首先,错误之处,对dfs时数组的更改,一定要使用记忆数组;判断有没有环只需把每条边正反存两遍

2015-03-17 19:49:25 839

原创 uva - 1379(无关状态不会被有用状态调用)

不会被调用到的状或者没有实际意义的状态,不会被调用到,就不会影响最终的结果,但在最终收集结果要避免它。本题,看上去没有好办法,直接dp空间时间都受不了,可以先排序对阵每个对手的一行,则该行会被用到的会是前几个,但我不确定一定是前5个,但这样去做,就A了,有待证明。本题有些特殊状态即前4天的状态,因为如第三天,在计算他的最优值是,只有他的前两天有参考价值,那么只参考前两个维度,d[ 3 ][

2015-03-17 14:10:44 446

原创 UVA - 12107(搜索)

本题主要难点在判断枚举出来的式子是否成立,本人采用对一个固定式枚举等号左面可改动位置的值然后生成乘积与后面的串匹配时间最坏需要10^4(前四位都为可改动位)判断是否成立,然后用迭代加深搜索枚举上限作为主算法,{     每次采用逐位确定。    特别注意最后拷贝串的改动。}#include #include #include #include #incl

2015-03-16 17:33:49 967

原创 UVA - 12219(唯一性标记法的应用)

题目就是用先建立#include #include #include #include #include #include #include #include using namespace std;typedef long long LL;const int maxn = 505555;struct node{ int c; int l,r; node(int

2015-03-14 08:25:55 1074

原创 UVA - 690(搜索+剪枝)

本题确实没什么好办法,只能暴力搜索,不过要加枚举剪枝和展望剪枝。枚举优化,就是事先试一下所有可行移动位置,搜索是只用这几个就行。展望及当前已经移动数加上剩下的最低估计也比当前最优解大,剪枝。还有本解不是最优的,看到有高手用位运算来模拟该搜索过程比纯属组快四倍。还有用位运算模拟,往前添加尝试不好办啊,若一直往前走数大的存不下,可以将当前的图往后移动,在前面添加。#include

2015-03-13 14:25:56 1219 4

原创 UVA - 1612(贪心类+精确度处理)

很简单的往下贪。精确度可以对double类型做读入处理成整数。本人采用了字符串转整数。也可以对读入的数(x+1e-4)*100.因为double类型数字保存的是对输入值的尽量精确值,加上1e-4则可保证一定比输入值大一点点,而不影响结果。#include #include #include #include #include #include using namespace s

2015-03-12 21:43:14 602

原创 UVA - 810 (A Dice problem 搜索)

这题有点坑,给的标准展开图中3和4的位置弄反了。除了这个地方之外,只能说自己太笨了,这个题目已经明显提示一个骰子两个面足够确定骰子是唯一的。所以状态就是坐标+顶面数字+前面数字。总共最多为row*column*24.状态转移是四。很快就可以解出。#include #include #include #include #include #include #include

2015-03-12 19:51:12 490

原创 UVA 11491

这道题有点水了,只是第一次做的时候陷入了误区,那时候学的是贪心。光记得贪了。这题目等价于把一个长为n的串保留一个字串使得把它看做一个10进制数的时候尽量大。做法,也离不开贪心思想。选取第一个数字时候,要在后面留下一个长度+1足够构成要求串的区间。然后在前面的区间选取最大值第一次出现的位置,即可。后面数字选取雷同。记得求最大值时候要优化,树状数组求区间最值不理解,干脆上了线段树。

2015-03-11 21:28:22 937

原创 UVA - 1611(构造类)

题目大意就是给定的一个长为n的串只让对长度为偶数的区间的两半 半对半交换(而非翻转),用不超过9^6(最坏接受nlogn的算法)次操作完成排序。方法,第一开始并没有没有想到脑筋陷入了死点。其实,就是采用往常的递推式思想,如果能解决了把1放在1处,那么剩下的就是个子问题。怎样将1快速放到1处,其实1在1处不用在考虑。若1在中点位置(偶数情况下选靠右的中间位置)则通过其次交换即可。

2015-03-11 21:18:18 506

原创 uva - 1442(cav 递推类 ,思路)

由于燃料为流动性物质。所以利用任意一个有水的地方往左右延伸其水平面一样高,可以先从左以尽量高的起点往前延伸遇到顶,下降到顶。遇到地面,上升到与地面同高度。这样再从右往左贪心一边去每个点的最小值即可。#include #include #include #include #include #include using namespace std;typedef long

2015-03-11 19:23:38 471

原创 uva - 1471(动态维护序列二元组)

本题的题意就是从长为n的串中截取一段,把剩下的两端拼接起来构成一个可以够成的最长连续上升子序列。首先本题若直接按照题意来先枚举截取的起点和终点在数一数就需要O(n^3)时间复杂度。n为2*10^5太大。价格预处理就可以避免数一数、以f(i) 表示以i位置为开头的连续上升序列的长度。g(i)表示以i位置为结尾的连续上升序列的长度。然后只需优化枚举环节。 可以只枚举右端点,快速找到

2015-03-09 13:34:10 410

原创 UVA - 10891(sum游戏,dp)

两个人可以从一个长为n的序列两边开始取石子,只能从任意一边取,且取的个数任意(最少为一个),求两人都在最优策略下的A与B的和的差。如N = 5;序列 1 2 3 4 5 则差为 15;以 d( i ,j  ) 代表先手最大得分,d(i,j) = sum(i,j) - min(d(i+1,j),d(i+2,j)..d(j,j)  ,  d(i,j-1),d(i,j-2),...d(i

2015-03-08 07:45:27 290

空空如也

空空如也

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

TA关注的人

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