动态规划
文章平均质量分 63
ZXLS-ZMR
我喜欢编程喜欢学习新的知识
展开
-
贪心算法-求区间至少连续k的最大和
题意:对于一个整数n,表示该区间整数的个数,求至少有k个连续的数是该区间中一段的最大和。n的范围在1~10^6。k(-1000~1000);分析:这道题看似有点像树状数组,但要想求出区间至少有k个连续的数的和是最大,恐怕是有点难度,顶多是求某一区间的和。不过可以沿着这个思路想,sum(n)-sum(i)?。如果这样想,我们就要判断n-i>=k;那换种思路:在第i的前面寻找最小值,在原创 2013-04-14 16:59:53 · 2131 阅读 · 0 评论 -
HDU-1176 数字塔DP
题目连接分析: 0秒 5 1秒 4 5 6 2秒 3 4 5 7 8 3秒 2原创 2013-07-16 20:55:24 · 745 阅读 · 0 评论 -
poj1925-Spiderman(dp)
题目连接题意: 蜘蛛侠从他最初所在的位置,到西塔,要经过一些高楼。而蜘蛛侠是从他所在的位置最高处出发,发出蛛丝粘在另一个楼的最高处,像荡秋千一样前行,它最远只能荡到对应的高度。如果荡到地面就不能再前行了。问你他达到西塔最小发出的蛛丝的次数。分析:自己不会!看下学长的。点击打开链接自己分析了一些: 根据题意。“蜘蛛哥”荡到的高度都等于第一个位置的高度。那么,问题原创 2013-07-18 19:43:16 · 740 阅读 · 0 评论 -
HDU-1003最大连续子序和
这题的思路很简单,只要连续相加的和大于或等于零,就一直加下去,如果在第i-1项小于零,把sum的值赋值为第i个序列的值。并记录它的下标,就可以了。#include#define N -10000000int main(){ int t,n,j,k,beg,end,cas=1; long sum,max; int a[100001]; scanf("%d",&t);原创 2013-07-25 09:28:17 · 839 阅读 · 0 评论 -
HDU-1059 Dividing 多重背包
啊!这题本来很简单,就是不细心,搞的我wa五六次啊,严重受到打击啊!多重背包转化成01背包和完全背包就可以了。这个题,是说能分成开不,那么两个人所拥有的价值是总价值的一半。把背包的容量刚好看成总价的的一半v(本来可以看成无限大)但没必要,因为它刚好用v的体积。那么就是,在容量为v的条件下,看能否把背包装满。这样就可以用多重背包实现了。#include#include#define ma原创 2013-07-25 21:19:01 · 804 阅读 · 0 评论 -
HDU 4648 magic pen
题意:去掉连续的数,使得它们的总和mod一个数不变。分析:模(m)一个数不变,在某些连续数字会存在能被m整除。除掉这些数,对余数是没任何影响的。故可以转化为:在n个数中,取出连续的的数使得它们的和能被m整除,求最多可以去多小个。这题和最大连续子序类似。于是设有:s[i]表示前i个数的总和。那么,要求得的是:(s[j]-s[i-1])%m==0 的条件下。求j-i+1的最大值(i到j相隔最远)。原创 2013-08-07 11:37:02 · 734 阅读 · 0 评论 -
HDU-4649 dp压缩
这个说的不错#include#include#includeusing namespace std;double dp[205][25];double p[205];char op[205];int num[205];int n;void solve(){ for(int i=1;i<=n;i++){ for(int j=0;j<=20;j++){ int t原创 2013-08-07 20:56:33 · 600 阅读 · 0 评论 -
poj1065-小小的贪心
题意: 木棍有长和宽,若一个木棍的长宽都大于另一个木棍长宽,就不需要耗费加工的时间。输出 木棍的长和宽,问最小的加工时间。分析:毫无疑问,加工的顺序应从大到小。先对长排序,相等的按宽度排序。这样就固定了长度,对于宽度,我们就要筛选了。为了避免重复,定义一个数组来标记,就可以了。只要符合要求每次都标记,这样每次能够筛选符合条件的木棍了。一个小小的贪心。代码如下:#incl原创 2013-05-09 19:40:59 · 770 阅读 · 0 评论 -
HDU-4689,dp啊!
题意:艰涩难懂的题意!,n个1,2,3...n的数,它的错排,错排后的序列与原来的序列相减,满足给定的符号。(+,-)。我dp好惨啊,不会搞啊!dp[i][j]表示前i个还有j个符号没确定。如果是第i个是加号,则从前面选,否则从后面选。#include#includetypedef long long LL;using namespace std;int main(){原创 2013-08-22 10:28:43 · 1042 阅读 · 0 评论 -
poj-1160 post office (dp)
题意: 根据每个村庄的距离,在这些村庄里建一些office使得每个村庄到最近的office距离和最短。分析: 如果此题建一个office,那么很容易得到,只要建在中间,就一定是最小的。这就是中值最小法,而这题是建立多个office,那么应该区间dp。设dp[i][j]在前j个村庄也建立了i个office。对于每个区间i到j,取中间的作为建立点。用dis记录每个区间最短距离。那么原创 2013-08-10 19:27:43 · 671 阅读 · 0 评论 -
HDU-1069 Monkey and Banana (DP)
题意: 有n中不同类型的长方体,同一种类型的长方体可以无限多。只要放置在上面的长宽严格小于下面的长宽就可以放置,因为必须留下适当的空间让猴子爬上去,问你n种长方体可以搭成最高的高度。分析:这题很容易想到用动态规划实现。考虑到每个长方体有六种 放法,而且按着所给的条件放置,先对其进行排序,按着长(宽)排序。用dp[I]表示放置 i个长方体所达到的最高的高度。代码:#in原创 2013-08-12 08:38:50 · 891 阅读 · 0 评论 -
SOJ-Dollars
New Zealand currency consists of $100, $50, $20, $10, and $5 notes and $2, $1, 50c, 20c, 10c and 5c coins. Write a program that will determine, for any given amount, in how many ways that amount may b原创 2013-12-01 19:00:48 · 681 阅读 · 0 评论 -
HDU-1559最大子矩阵
方法:先将x个行压缩成一行,然后再求连续y个最大子序和。数据范围不是1000,真坑。#include#include#includetypedef __int64 LL;using namespace std ;const int N=2005;int a[N][N];LL b[N];LL Maxsum(int n,int k,LL *s){ LL ans=0; f原创 2013-12-02 15:37:30 · 651 阅读 · 0 评论 -
HDU-1058 Humble Numbers
最近自己感觉动态规划这方面太差,就在各大oj上找了一些基础的dp题来A啊。这个dp题,虽说是入门的。但对于我,也有些棘手啊!1-->12--->min(1*2,1*3,1*5,1*7)---->23--->min(2*2,1*3,1*5,1*7)----->34---->min(2*2,2*3,1*5,1*7)----->4;5---->min(2*3,2*3,1*5,1*原创 2013-07-17 10:14:42 · 683 阅读 · 0 评论 -
HDU-1421 搬寝室-dp
中文题,题意不用解释了。分析: 用dp[i][j] 表示i个物品分成j组的最小代价。(这个很关键)做dp题第一步就是,用一个dp数组表示相应问题的含义。这个做好了,写状态方程就容易一些。根据题意: 当 i==2*j状态方程为: dp[i][j]=dp[i-1][j]+(a[i]-a[i-1])^2 说明:a[]中的数据是经过从小到大排序的。理论:原创 2013-07-15 11:29:00 · 700 阅读 · 0 评论 -
poj1328-DP
没想到这是道水题,我先把意思搞错了,认为雷达是建立在小岛中,个岛相互联系,我就有点摸不着思路,无赖之下,到网上一搜,我才知道,自己想错了。这完全是数学分析题,先不说是不是DP,我们先要对问题进行模型化,即数学建模,既然是建在海岸线边,问题就简化了许多。简化为区间覆。,要使一个岛屿被圆覆盖,最极端的情况,就是刚好在圆周边上,这是一个处理问题的一个关键点,想想看,要减少雷达的个数,我们就必定把原创 2013-04-30 22:19:07 · 763 阅读 · 0 评论 -
HDU-1025,最长上升子序列(nlogn)算法+详解
题目连接分析:此题就是一个最长上升子序列的一个变形题,没什么难度。关于LIS问题,有两种算法,一种是dp,时间复杂度为n^2,另一个是二分+Dp,之所以能用二分查找,关键在于它用辅助数组保存了具有递增的数据,正好适宜二分查找。而查找的整个序列D中,有错落的递增式,也就必定存在最长的一个,它们的元素就构成了一个递增有序的集合M,第一个必定是在M中最小,而且第一个最小的元素,一定是在D中靠前的原创 2013-05-21 19:33:22 · 1111 阅读 · 0 评论 -
poj3670,LiS(二分查找)
如果熟悉LIS问题,这题基本上可以说是水题了。稍微改了点。相同可以认为是上升的。然后就是正反求最长上升子序列。代码:#include#includeint dp[30010],N;int a[30010],b[30010];int search(int n,int m){ int i=1,j=n,mid; while(i<=j) { mid=(i+j)>>1;原创 2013-05-21 22:13:02 · 779 阅读 · 0 评论 -
poj2533,LIS问题(n^2)
做了LIS问题,尝试去A一些水题。正好这是一点典型的LIS问题。本题没什么限制,O(n^2)的算法完全可以过。代码:#includeint main(){ int i,j,n; int dp[1005],a[1005]; while(scanf("%d",&n)!=EOF) { int max=1; for(i=0;i<n;i++) scanf("%d",&a原创 2013-05-22 18:55:27 · 800 阅读 · 0 评论 -
poj2250-打印单一LCS路径。
题目连接题意:就是一个最长公共子序列。并打印其路径。分析:最长公共子序列还不难,注意是打印它的一条路径。我们知道是用二维数组dp来保存它的匹配数。一旦有匹配的它就修改后面的值,保证了如何一个状态当前的dp数据中是最大的值。看一张经典的图:显示了路径的回溯。帮助我们能找到匹配的的过程。为了记录它转移的方向。我们需要用辅助数组map来记录它是有那个状态转移而来的。可以用递归原创 2013-05-23 11:09:13 · 825 阅读 · 0 评论 -
poj1050-最大子矩阵和
题目连接题意:给出N*N的矩阵,求它子矩阵的最大和。分析:这题是最大子序列和的一个扩充。关键是怎样用单一的子序列来求矩阵。目前没想到什么高深的算法。只有枚举了,只是小小的dp。先求出矩阵一行,相当于求最大子序列和,再次求两个合并的,三个合并的,一直到n个。时间复杂度为(n^3)不过这题数据不大。完全可以A了。代码:#include#includeint a[10原创 2013-05-23 22:05:50 · 841 阅读 · 0 评论 -
poj1934-打印LCS全部路径+搜索
题目连接题意:打印全部LCS路径,并按照字典顺序输出。本题比较难。参考神人代码稍做改进如下:#include #include #include #include #include using namespace std;const int N=100;set SET;char s1[N],s2[N],temp[N];int len1,len2,lon原创 2013-05-23 20:25:17 · 1188 阅读 · 0 评论 -
服务员-dp
题意:服务员要服务每个顾客,顾客在订蛋糕后,要求服务员把蛋糕分成一份。对于蛋糕总体积(n),每次分成开成两个部分,要花费n*(n-1),而后面又有顾客来订蛋糕,时间可能发生了冲突,为了服务更多的顾客,可以放弃花费时间多的顾客,以确保服务顾客数量最多。第一组k,表示顾客的总人数。接下来是k组数据,每组两个,第一个是顾客到的时间,第二个是订的蛋糕体积。输出最多服务顾客的总数。分析:原创 2013-04-17 19:45:51 · 925 阅读 · 0 评论 -
poj3635-DP+优先队列搜索最短路
题目连接这题限制较高。一般的算法过不了。自己做起来很吃力。到网上参考牛人代码为之惊叹,处理方法真是不可思议。佩服!佩服!这题难点就是如何判断汽车加油的问题。为什么加油是一升一升地加。主要是设计的dp搜索是关于路径与油的体积的状态。我认为非常巧妙。把问题简化了许多,能用的dp的思想和优先队列来进行搜索,为之叫绝。稍微简化了代码,时间也减小了点,心里还是稍有点欣喜。#inc原创 2013-05-27 22:18:09 · 1085 阅读 · 0 评论 -
HDU-4476
题目连接题意:每个绳子最多只能剪一次。给你n条绳子,问最多可以割成多小条相同的的绳子。分析:先从单个绳子看,要么割成两个不同的,要么相同的。另外我们可以知道割成的长度最多是以为小数点。比如,2,3,最优的方案:是吧3割成1.5和1.5.,2割成1.5.为了处理方便,把它们乘以一个2,它的好处就是把小数转换成整数来处理,这是等效的。其实,我们发现,要使割的相同的绳子最多。就是尽量把每个绳原创 2013-06-08 21:13:09 · 875 阅读 · 0 评论 -
poj1191-dp棋盘分割
点击打开链接用汉字写的题目,不容小视。这题要很好的空间想象力,开了一个五维数组dp[k][x][y][xx][yy],表示把对角线为(x,y)-(xx,yy)的矩形分割成k块能获得的最小值。先看问题,要我们求方差;如果不化解,有点无从下手.可以为S^2=(1/n)∑xi^2+x^2, (xi表示每个矩形的权值,x 是平均值。)而对于一个给定的棋盘平均值是确定的。要求最小,原创 2013-06-03 20:45:58 · 826 阅读 · 0 评论 -
poj1390-dp消方块
题目连接分析:此题我纠结很久,写不出动态方程,看神人代码以后,用一个三位数组dp[i,j,k],表示从第i个到第j个可以消去的方块个数所能获得的最大值。那么就有:dp[i][j][k]=dp[i][r-1][0]+(len[r]+k)^2; len[r]是表示第从r个有连续相同的个数。代码;#include#include#define Max(a,b) a>b?a:b原创 2013-06-04 21:43:27 · 799 阅读 · 0 评论 -
poj_1088 记忆搜索
题目连接中文字,题意就不必过多解释。也许是以前做了最长上升子序列,感觉这题有点类似。这不是二维的吗,其实这题不然。这条路径可以转弯,可以想到用搜索。单独的搜索还不够,我们必须要用保存每个位置的最长路径,这样只要找出最大的就可以了,所以这可以用dp+DFS实现了。代码:#include#include#include#define max(a,b) a>b?a:busing原创 2013-07-13 10:54:09 · 782 阅读 · 0 评论 -
UVA-1330 LA 3029 City Game(最大子矩阵)
题意:在m*n的矩阵中,其中一些是空格子用(F)表示,其他的是阻碍物(R),找出一个全部由F组成面积最大的,输出面积乘以3.分析:用数组up[i][j]从第i行到第j行所能达到最大的长度,lt[i][j]表示第i行的第j列向右所能达到的长度,同理rt[i][j]。#include#include#includeusing namespace std ;const int M=10原创 2013-12-02 18:23:07 · 869 阅读 · 0 评论