自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Noooooorth的专栏

Two steps from heaven.

  • 博客(28)
  • 资源 (1)
  • 收藏
  • 关注

原创 POJ 3280 Cheapest Palindrome(区间DP)

经典的区间DP,对于每个字符,在原字符串加上这个字符的代价是一个值,移除又是一个值,求把原字符串变成回文串的最小代价。经典的区间DP,状态转移方程见代码。在输入进行了一个处理,我们把对一个字符的增与删的操作的代价压缩成为一个数,代表对该字符进行增或删代价,把另一个相对较大的代价则忽略掉。因为在一遍插入一个字符与在另一边删除一个同样的字符对回文串形成的贡献效果一样(可以仔细思考一下)。

2015-07-29 17:13:19 1810

原创 POJ 1948 Triangular Pastures(DP)

给出n条边,输出这n条边组成三角形的面积的最大值*100。数据范围是边数不大于40,每条边长度不大于40。所以我们可以尝试可不可以暴力求解。首先定义一个数组dp,dp[i][j]表示三角形一条边长为i,一条边长为j的情况存不存在。那么状态转移方程就是dp[j][k]|=(dp[j-e[i]][k]||dp[j][k-e[i]]),表示j或k是否可以由原来的边加上某条边得到。若由j,k,(sum-j-k)形成的三角形存在,计算出所有的最大值。

2015-07-29 17:09:49 1094 2

原创 POJ 1014 Dividing(二进制优化+多重背包)

题目大意:有权值分别为1,2,3,4,5,6的大理石,每种都有若干块,也可能没有,问你能否把它们分成权值相等的2份。大理石的总数量不超过20000。普通的多重背包时间复杂度为O(V*Σn(i)) V为空间容量,n(i)为每种石头的数量限制。题目看上去是多重背包,背包容量为石子权值总和的一半。但是我们可以通过二进制优化将其变成01背包(详见背包九讲V2.0章节2.4)。所谓的二进制优化就是把一个正整数拆成2^n之和和剩余的数。比如17,我们先拆分出1,然后是2、4、8,这是我们发现如果再往后拆的话1+2+

2015-07-29 17:07:48 1924

原创 HDU 3033 I love sneakers!(01背包变形)

题目的难点就在于每种牌子至少选一种。网上好多人说这道题属于分组背包,但我认为这道题只是一道加了条件限制的01背包。但这个不重要(手动斜眼)。首先把各个品牌的鞋子放到各自对应的vector中,然后遍历每种品牌的每双鞋,再然后就是我们熟悉的for(int k=V;k>=brand[i][j].w;k--)了。但在状态转移的时候我们要加上一个判断,从当前我们要选的品牌转移来的状态不用判断,因为是否选择当前的一双鞋与本组内是否有鞋被选无关。而从上一组转移状态要加上一个if判断句,判断上一组是否有鞋被选中,如果没有

2015-07-29 17:07:12 1930 1

原创 HDU 3501 Calculation 2(欧拉函数)

对于给定的n,输出小于n的且不与n互质的正整数的和。做这道题首先要知道欧拉函数,对正整数n,欧拉函数是小于或等于n的数中与n互质的数的数目;而且要知道这样一个结论:如果gcd(n,i)=1,则gcd(n,n-i)=1。知道以上两条结论,这道题的思路就大致清晰了。首先可以知道在[1,n-1]中与n互质的数是成对出现的,即如果i与n互质,则(n-i)一定与n互质。这时我们发现这对于n互质的数的和为n。所以可以得出结论:小于等于n的同时与n互质的数的和是n*Euler(n)/2,Euler(n)表示小于n与n

2015-07-28 23:55:03 2058

原创 HDU 2601 An easy problem(暴力枚举/质因子分解)

求满足n=i*j+i+j(0<i<=j)的i、j的种数。第一种方法:首先这个等式可以化成(n+1)=(i+1)*(j+1),所以只要求出(n+1)的约数的种数即可。同时注意到i与j呈负相关,同时i小于等于j,所以只需要从2到sqrt(n+1)枚举(从2开始是因为i最小为1,我们枚举的是(i+1))。但是,好暴力啊。所以我们可以用筛法先保存1e5以内的素数,再通过质因子分解求出约数数量。第二种方法:观察等式n=i*j+i+j,可以转化成n-i=(i+1)*j,发现暴力枚举i,判断(n-i)%(n+1)==

2015-07-28 23:50:28 2048

原创 POJ 1159 Palindrome(区间DP/最长公共子序列+滚动数组)

给一个字符串,计算最少加多少个字符能够使字符串变成回文串(即从前往后读与从后往前读一样)。有2种思路,一种是直接区间DP,dp[j][i]表示[i,j]这个子串要变成回文串需要添加多少个字符,状态转移方程如下:if(s[i]==s[j]) dp[j][i]=dp[j+1][i-1];else dp[j][i]=1+min(min[j+1][i],min[j][i-1])第二种思路也比较容易想,要将一个字符串变为回文串,那么我们

2015-07-26 23:56:38 2124 2

原创 POJ 3071 Football(概率DP)

编号分别为1、2、3……2^n的2^n个队伍参加比赛,每一轮相邻的两两比赛,胜者晋级下一轮,负者淘汰,直到只剩下一支队伍。基本思路:dp[i][j]表示第i轮比赛j号队胜利的概率,第i轮j要获胜,首先第(i-1)轮j要获胜,(所以dp[0][j]要初始化为1),用k表示能与k在第i轮比赛中相遇的对手,而且如果j与k要相遇,k也必须在第(i-1)轮中获胜,所以状态转移方程为dp[i][j]+=dp[i-1][j]*dp[i-1][k]*p[j][k],注意,是相加,即把遇到每个对手且获胜相加就是j在这一轮获

2015-07-26 23:30:07 1747

原创 POJ 2479 Maximum sum(双向DP)

1000ms,50000个数,所以每次处理的时间复杂度不能超过nlogn,否则会超时。所以要让最后扫描一次就能求出答案。基本思路就是第一次遍历先定义2个数组,分别记录前i项和(含i)与后i项和(含i)。第二次遍历再定义2个数组,分别记录以i为终点(含i)的最大子段和与以i为起点(含i)的最大子段和。第三次遍历再定义2个数组,分别记录第i项(含i)的之前的最大子段和与第i项(含i)的之后的最大子段和。最后遍历一遍数组求出i之前(含i)子段和与i之后(不含i)子段和的最大值即可。

2015-07-26 23:26:10 1830

原创 POJ 1837 Balance(DP)

给出C个挂钩的位置以及G个重物的质量,求有几种方式使得天平平衡。这道题乍看要用搜索,其实DP就可以。dp[i][j]表示挂完前i个重物能使力矩为j的情况种数,j=0时表示平衡。所以状态转移方程就是dp[i][k+loc[j]*wei[i]]+=dp[i-1][k],表示前(i-1)个重物挂完后合力矩为k,这时在第j个挂钩处挂上重物i,则两者要相加,即dp[i][k+loc[j]*wei[i]]就要加上dp[i-1][k]。有一点要注意,力矩可能为负数,所以dp数组的下标可能越界,所以要把力矩加上一个力

2015-07-26 23:23:02 1728

原创 POJ 1088 滑雪(记忆化搜索+DFS)

100*100的矩阵,如果裸dfs很可能超时,所以可以用记忆化搜索的方式,dp[i][j]表示当前到达[i,j]的最长路径,在dfs的同时,更新dp[i][j]。思路总体来说很简单。

2015-07-26 23:19:18 1821

原创 HDU 2112 HDU Today(floyd-warshall+map)

基本上是floyd-warshall的模板题,直接调用函数,注意map的使用即可,还要特别判断n=0的情况。

2015-07-25 02:00:36 1735

原创 POJ 2002 Squares(二分)

给一个平面散点集,判断能够构成多少个正方形。虽然有3.5秒,但四层暴力循环的话肯定会超时循环。所以有这样一种思路:先把点排序,双层循环枚举前(n-2)个点,为了防止重复判断,第二层循环里的j要从i+1开始,二分查找后(n-j)个点中是否存在能与s[i],s[j]构成正方形的点,所以第二层循环结束的条件是j<=n-2,剩下2个点用来查找,二分查找的范围是[j+1,n]。

2015-07-25 01:58:20 1824 3

原创 HDU 1163 Eddy's digital Roots(九余数定理+快速幂)

九余数法,也叫弃九法,可以用来求一个数的弃九数,也能叫“根数”(即求这个数所有位的数的和,如果不是10以内的数,就重复这个过程,直到变成10以内的数,比如128的结果就是2,首先把128中的1,2,8相加得到11,再把11的1,1相加得2),求弃九数的方法就是拿这个数对9取模,若为0则弃九数是9,否则为余数。更进一步可以用来验算加减运算是否正确,比如1863+716=2579,首先1863的弃九数为9,716弃九数为5,2579弃九数为4,因为(9+5)%9=4,所以加法运算很可能正确(注意!仅仅是很可能

2015-07-24 21:10:23 2167 1

原创 HDU 2298 Toxophily(公式/三分+二分)

已知发射点坐标为(0,0)和重力加速度g=9.8,给出目标的坐标和初速度,求能够击中目标的最小仰角。有两种思路,第一种是直接假设能够击中目标,写出公式,化成一元二次方程,把公式内的三角函数全部化成tan,判断[0,PI/2]有无解;第二种方法就是三分+二分,首先三分仰角,求出轨迹在x处的纵坐标,若纵坐标最大值小于y,则直接输出-1,三分过后[0,r]上就是单调递增的,直接二分即可。

2015-07-24 08:51:51 1889

原创 POJ 2965 The Pilots Brothers' refrigerator(DFS)

与POJ1753类似,把矩阵的状态转换成一个16位的二进制数,'+'对应位为1,反之为0。到达终点的标志就是矩阵的二进制数为0。对4*4矩阵的16个点进行dfs,分为翻转和不翻转两种选择,最终输出路径。

2015-07-23 00:57:40 1570

原创 HDU 3400 Line belt(三分)

这道题是典型的三分,因为从一点到另一条直线上的点的距离的变化不是单调的,而是先减后增,所以需要用嵌套三分。首先三分AB,再依次以mid和mmid为起点,CD上的某点为终点三分即可。

2015-07-23 00:56:04 1674

原创 HDU 1978 How many ways(DP)

每到达一点[i,j]就扫描从这个点能到达的点[i+k,j+l],种数相加即可(dp[i,j]=(dp[i,j]+dp[i+k,j+l])%10000)。

2015-07-23 00:53:40 1500

原创 HDU 1010 Tempter of the Bone(DFS+剪枝)

题目大意是不能回头,问狗是否能在规定的时刻到达门处。不难想到用dfs,但是普通的dfs会超时,所以就要剪枝。这一题最重要的一个剪枝就是判断曼哈顿距离与规定时刻的奇偶性是否相同,如果不同则一定不能在规定时刻到达。因为狗如果能在规定时刻之前到达大门处一定需要先离开离开再进入最短路,所以差值一定是偶数。另外还要注意题目输入的t之后可能会多一个空格,用getchar()的要注意。

2015-07-23 00:51:18 1503

原创 POJ 1315 Don't Get Rooked(DFS)

和N皇后问题类似,这道题让求出棋盘在被墙分隔的情况下的最多能放的棋子的个数,使分隔后的每行每列仅有一个棋子。方法是从前到后dfs,同时用4个循环判断位置是否合法。

2015-07-22 00:21:04 1673

原创 POJ 1068 Parencodings(暴力枚举)

题目大意:对于一个由左括号'('和右括号')'组成的字符串S,给出其P序列,输出对应的W序列(P序列中P[i]表示在第i个右括号有P[i]个左括号,W序列中W[i]表示由第i个右括号组成的括号对内有W[i]-1对括号,详见样例)。基本思路是先由P序列还原出每个右括号在S串中的位置。最后循环每次从后往前扫描到与第i个右括号对应的左括号,输出区间内的左括号数。因为n最大为20,所以暴力也不会超时。

2015-07-22 00:19:17 1573

原创 HDU 1237 简单计算器(栈)

首先处理输入的字符串,拆分成操作数和操作符。然后把操作数和对应的操作符(只能为'+'和'-')依次压栈,如果遇到对应的操作符为'*'或'/',则弹出栈顶元素与当前数进行乘除,再把结果压栈。这样一轮操作下来,操作符就只剩下'+'和'-',最后把操作数栈和操作符栈的元素弹出计算。

2015-07-22 00:18:12 1789

原创 POJ 1753 Flip Game(BFS)

一个4*4的棋盘,每次选一个位置,将该位置及其上下左右共5个位置的棋子翻转,问最少翻转多少次可以使16个棋子颜色一样。由于棋盘已经固定为4*4的大小,所以可以用一个二进制数来表示当前整个棋盘的状态。

2015-07-21 00:30:33 2157

原创 Gym 100712I Bahosain and Digits(枚举)

题目大意就是给一个序列,每次可以转动一个区间,使这个区间的值加1,9则变成0,目标是是这个序列的值最终一样,求每次转动的区间的最大长度。可以先从大到小枚举区间长度ans,同时枚举最终整个序列的值k,在循环体内计算每一位要转动的次数,同时对后(ans-1)位进行特殊判断,如果当前情况合法,则后(ans-1)位需要转动的次数都为0。循环体内不能每次修改ans个值,会造成超时,所以循环体内的时间复杂度要是O(n)。因此我们可以定义一个数组change,change[i]表示经过前i-1次转动第i个位置要转动为k

2015-07-21 00:28:39 1094

原创 Gym 100712G Heavy Coins(DFS)

题目大意是给你N个硬币,从这N个硬币中拿出若干个硬币使总和大于S,同时从你所选的这堆硬币拿走任何一个都会使总和小于S,也就是说取出若干个硬币且取出的这些硬币没有一个是多余的,求最多能拿出多少个硬币。题目的N只有10,所以基本上怎么做都行,可以枚举所有的情况,最多也只有1000+种情况,也可以dfs搜索最大个数。但要注意dfs要从大到小,以防止出现拿走一个硬币时总和仍旧大于S的情况。

2015-07-21 00:27:01 846

原创 Gym 100712F Travelling Salesman(二分+并查集)

题目大意就是一个人要周游所有城市但他所驾驶的汽车的油箱容量有限,告诉你走这些城市之间的道路的所需要的油量,求可以使这个人可以到达所有城市的最小容量,也就是从任何一个城市可以到达另一个城市。由于每条路的C值最大是100000,所以二分只需要不到20次。所以思路就是二分时用并查集判断整个图是否连通。这道题还有另一种思路,就是dijkstra算法,同样十分简单,不再赘述。

2015-07-21 00:23:31 853

原创 Gym 100712B Rock-Paper-Scissors (前缀和维护)

题意很简单,就是给出A出石头剪刀布的顺序,同时B是先出X个布,Y个石头,Z个剪刀,每局胜者得一分,求进行N轮游戏后B的分数比A多的种数。首先维护6个前缀和,比如Rwin[i]代表前i个都出石头时B赢的总局数,以此类推。N最大是1000,所以可以双重循环暴力求解。

2015-07-19 23:57:22 1219

原创 HDOJ 1754 I Hate It(线段树单点更新)

I Hate ItTime Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 48470    Accepted Submission(s): 18969Problem Description很多学校流行一种比较的习惯。

2015-07-19 23:54:40 475

McAfee官方卸载工具 MCPR

McAfee官方卸载工具,双击直接运行即可完全卸载McAfee

2016-06-16

空空如也

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

TA关注的人

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