- 博客(21)
- 收藏
- 关注
原创 poj 3279 Fliptile
题意:一个n * m的棋盘,0或1,每次改变一个格子时同时改变上下左右的格子,问用最少次数将棋盘全变成0的策略。题解:用二进制压缩第一行更改的状态,之后遍历棋盘,如果当前格子为1则改变下方的格子,记录改变次数最小的状态为ans,最后模拟一次ans状态时的策略并输出。代码:#include<stdio.h>#include<iostream>#include<algorithm>#include
2015-02-22 16:25:29
443
原创 POJ 2677 Tour
题意:双调欧几里得旅行商问题。算法导论15-1题,从最左边的点严格从左走到右再从右走到左回到起点,所有点都要走且只走一次,求最短路径。解法:定义dp[i][j]表示从i走到j的双调路径,分为两种情况:当j < i - 1时,dp[i][j] = dp[i - 1][j] + dis[i - 1][i]当j = i - 1时,dp[i][j] = min{dp[j][k] + dis[j][k]}
2015-02-22 12:14:10
421
原创 UVA 1474 Evacuation Plan
题意:有一条公路,上面有n个施工队,要躲进m个避难所中,每个避难所中至少有一个施工队,躲进避难所的花费为施工队与避难所的坐标差的绝对值,求最小花费及策略。解法:将施工队和避难所按坐标排序,可以看出有下列递推关系,dp[i][j]表示前j个施工队进入前i个避难所的花费,则有dp[i][j] = min(dp[i][j - 1], dp[i - 1][j - 1]) + |a[j] - b[i]|。由于
2015-02-22 11:51:24
446
原创 重载运算符
大概学了一下重载运算符的方法···鉴于我的记性实在是呵呵呵呵···写个test···顺便记一下那个构造函数(就当他是吧)的写法TUT#include#include#include#include#include#include#include#include#include#include#include#include#include#include#d
2015-02-17 22:05:03
573
原创 ZOJ 2283 Challenge of Wisdom
题意:在一个n * m的地图里,有p个宝藏,每次只能向横纵坐标增加的方向走,问最少走几次能把宝藏都拿走。解法:按横坐标排序,纵坐标的一个不下降子序列就是一条合法路径,要求多少条不下降子序列可以覆盖所有点,这个问题可以转化为最长下降子序列的长度。代码:#include#include#include#include#include#include#includ
2015-02-16 21:39:47
725
原创 SGU 134 Centroid
题意:给出一个树,每个点有一个value,value的意义是去掉这个点之后所有连通分量中点最多的那个连通分量的点数,这棵树的重心为所有点value的最小值,求重心,及重心都有谁。解法:貌似是个树形dp,不过不太懂树形dp···学了一下也没太明白这题为啥是树形dp···觉得其实是深搜···嗯···随便找一个点当做根,我选了点1,每个点的value = max{max{sum[j]},
2015-02-16 19:47:40
522
原创 UVA 1637 Double Patience
题意:36张扑克,平分成9摞,两张数字一样的可以拿走,每次随机拿两张,问能拿光的概率。解法:记忆化搜索,状态压缩。一开始我想在还没拿的时候概率是1,然后往全拿光推···样例过不去···后来觉得推反了,改成了深搜,模拟拿牌的过程,九摞牌的状态用9位五进制表示。代码:#include#include#include#include#include#include#i
2015-02-15 00:39:10
580
原创 HDU 4389 X mod f(x)
题意:求[A,B]内有多少个数,满足x % f(x) == 0。解法:数位DP。转化为ans = solve(b) - solve(a - 1)。设dp[i][sum][mod][r]表示长度为i,各位和为sum,模mod余r的数的个数。当在数字后面新添加一位j时,则有dp[i + 1][sum + j][mod][(r * 10 + j) % mod] += dp[i][sum]
2015-02-11 19:29:10
423
原创 HDU 4899 Hero meet devil
题意:一段DNA序列s,只包含字符ATGC,长度不超过15,求有多少种长度为n的DNA序列与s的最长公共子序列长度为0~len。解法:状压dp。LSC:if(a[i] == b[j]) dp[i][j] = dp[i - 1][j - 1] + 1;else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);dp[
2015-02-09 12:15:07
1203
原创 Timus 1746 Hyperrook
题意:在一个n维坐标系中,坐标的范围是0到m - 1,如果两个点坐标只有一个维度的坐标不同则可以相互移动,给出p个点,问任意两个点之间路径为d的个数是多少,答案与p取模。解法:只需要考虑两个点之间不同的维度的个数,递推方程:f[i][j]表示第i步时维度不同个数为j的路径数,f[i][j] = f[i - 1][j - 1] + f[i - 1][j] + f[i - 1][j + 1
2015-02-06 15:34:53
356
原创 POJ 3377 Ferry Lanes
虽然它出现在dp专场里···但是我第一反应是一道最短路题···不过幸好它出现在dp专场里···因为我不怎么会dijstra什么的···题意:一条河上有N+1对码头,每个相邻码头之间需要一定时间到达,每对码头之间也需要一定时间到达,如下图:给出起点码头和终点码头,问最短到达时间。解法:假设起点码头一定在左边,终点码头一定在右边,那么为了时间最短一定是向右或向上(下
2015-02-01 16:30:11
864
原创 ZOJ 3264 Present for MM
寒假开始了···但是做题没有结束嘤···然后是dp专场嘤···题意:背包问题,给出背包容量和物品对数,每对物品都有特殊的关系:第一种关系是两个物品都取有价值,若只取一个则失去价值;第二种是两个物品只能取一个,都取则失去价值;第三种是只有当第一个被取时第二个才能被取,但可以单独取第一个物品。解法:第一种关系只要将两个物品看做一个物品就可以了,第二种关系是分组背包,第三种关
2015-02-01 11:29:27
410
原创 LA 6540 Fibonacci Tree
以前做过的题···重新做一遍之后怎么做怎么wa···后来GG了···第二天看不知道为啥A了···难道我失忆了?题意:无向图,边有黑色和白色两种颜色,求是否存在一个生成树中白边的个数是斐波那契数。解法:并查集。对边按颜色进行排序,白边在前用并查集计算生成树中白边个数,再倒着算一遍,得到生成树的白边的最大值和最小值,判断其中有没有斐波那契数,注意要判断是否能构成生成树。
2014-12-03 19:30:37
489
原创 UVA 10054 The Necklace
#include#include#include#include#include#include#include#include#include#include#include#define ll long longusing namespace std;int color[55][55];int ans=0,st=0;int n;struct node{
2014-10-14 16:58:51
448
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人