摘要:题意:给定一个字符串d,要求用另一字符串s去匹配,其中s中的?可以为任何字符,*可以为任意个字符,求最小的匹配权值思路:这题和CSDN英雄会的“反相互”类似,由于其中某些字符的不确定性,利用动态规划来对每个字符求解。只不过这个题更灵活了一些,但是本质是一样的。考虑s中的第i个元素,当匹配到d中的j元...
阅读全文
摘要:题意:给定一堆2二进制砝码,给定一个物品,要求在天平两端加入物品和砝码使之平衡,求可能数。思路:一开始想到了直接用数学原理,结果没证出来。做如下思考,此题需要用二进制:(1)设物品重量为w,加入的砝码重量为x,另一边重量为y,便有w+x=y。(2)另外,假如物品为100110,加入的砝码可以为000...
阅读全文
摘要:题意:求最长上升子序列,n=100000思路:O(N^2)铁定超时啊。。。。利用贪心的思想去找答案。利用栈,每次输入数据检查栈,二分查找替换掉最小比他大的数据,这样得到的栈就是更优的。这个题目确实不错,思路很好#include #include #include #include #include ...
阅读全文
摘要:动态规划与贪心相关:{HDU}{4739}{Zhuge Liang's Mines}{压缩DP}题意:给定20个点坐标,求最多有多少个不相交(点也不相交)的正方形思路:背包问题,求出所有的正方形,然后求最多有多少个正方形不互相覆盖,这题真是神思路。{POJ}{3846}{Mountain Road}...
阅读全文
摘要:思路:给定一个字符串,求两个不重叠的字串,他们翻转互补。其中一个字符串可以是删掉最多两个字符的原字符串子串。动态规划,由于可以对子串进行删除操作,我首先想到了LCS问题,但需要枚举所有的长度,这样复杂度为O(N^3),不可取。由于长度线性增加,考虑使用二分查找目的长度,这样复杂度为O(N^2*log...
阅读全文
摘要:思路:给定一系列时刻表,求能满足各个时刻的最小火车数量。打眼一看, 把此题归入到最大流,仔细一想不符合流网络的规律,换思路。由于是一个最优化问题,自然想到动态规划和贪心。最后确定贪心。从最早出发的火车切入,到目的地后便可以选择下一次满足的时刻表,贪心思想找最近的一个时刻表(关于贪心的证明可以参看《图...
阅读全文
摘要:对数组进行预处理,由于是连续的可以在O(1)的时间进行判定查询,WA了N次。#include <iostream>#include <string>#include <cstring>#include <cstdio>#include <algorithm>#include <memory>#include <cmath>#include <bitset>#include <queue>#include <vector>#include <stack>using
阅读全文
摘要:上午在图书管从吴文虎教授的那本ACM/ICPC高级教程上看了一道题,虽说不上经典,但其中的思想还是可以借鉴的。题意:以一元为本金,能获得的最大收入,第i天股票价格为v[i],1<=i<=m思路: (1)DP思路明显,直接进行动态规划,令f[i]代表第i天所获得的最大收入.那么有公式: f[i] = max{f[i-1],f[j]*v[i]/v[j]} (1<=j<i...
阅读全文
摘要:题意:给定n个数,求两段连续子列的最大和。思路:先从左向右dp,求出一段连续子列的最大和,再从右向左dp,求出两段连续子列的最大和,方法还是挺经典的。[代码]
阅读全文
摘要:题意:有个伸缩门,门的宽度0~K,每个时间可以伸长或缩短1个单位,有N个流氓,他们在T时刻到达,如果这时门的宽度正好与他们的stoutness相等时,便可获得一定的收入,问最大的收入是多少。思路:典型的动态规划,用dp[t][k]来记录t时刻门宽度为k时的最大收入,由于这个值只与dp[t-1][]有关,所以可用滚动数组来实现,不然会超内存,另外存储流氓时还是利用struct来存放,否则内存不够,还...
阅读全文
摘要:题意:有n个城市,一个人从i到j城市时,可以得到income[j]的财富,需要消耗cost[i][j]的财富,也可以选择不动,也就是呆在i城市,那么可以得到income[i]的财富,需要消耗cost[i][i]的财富,但每个城市的incom[]是随天数变化的,求出m天内这个人能获得的最大的财富值。思路:很明显的dp,用dp[m][i]记录第m天,在第i个城市时所能获得的最大财富值,有一个地方需要注...
阅读全文
摘要:题意:给定n和k,要求找出k个互不相同的素数,使其和==n,求这样的组合有多少中思路:因为素数互不相同,自然想到了0-1背包,可是怎么背包却想了很久,因为多了一个限制:k,那么必须用两维数组来做,用dp[M][K]表示在组成M时,K个素数互不相同的情况,于是可以用0-1背包来对每个prime进行dp: dp[m][k] = dp[m][k] + dp[m-prime[i]][k-1]; //注意...
阅读全文
摘要:题意:牛Bessie可以在两棵苹果树之间来回走,在连续的一段时间内,每分钟都从两棵树之间掉苹果,但同一分钟只有一棵树掉,Bessie一分钟只能在一棵树下接苹果,问在规定的步数之内,Bessie最多可以吃掉多少苹果。思路:此题用动态规划思想考虑,在第m次移动后,在t分钟所获得的苹果是根据第m-1次移动第t-1分钟 和 第m次移动第t-1分钟决定的。记f[m][t]为第m次移动t分钟时所获得的最大的数...
阅读全文
摘要:题意:给定一个多边形,顶点时数字,边是操作,问去掉一个边后,能得到最大的数字是多少,并且输出这些情况。这题是矩阵链相乘的变体,用dp做就可以了,但是要注意,两个负数相乘有可能也是最大的,所以一个状态的最大数和最小数都要记忆,最后寻找最大数就可以了。[代码]
阅读全文
摘要:题意:给定n个区间,求一个点集S,使每个区间最少有两个元素在s中。思路就是贪心咯,按区间的终止点(右边的点)从小到大排列,我们每次取区间最右边的点(所取的几个点是最优的),使这个区间内至少有两个点在s中,贪心的证明很简单,在纸上画一画就出来了。[代码]
阅读全文
摘要:一道贪心题目,题意:有n个木棒,分别不同的长度和不同的重量,一个机器需要处理这些木棒,如果第i+1个木棒的重量和长度都>=第i个处理的木棒,那么将不会耗费时间,否则需要增加一个单位的时间,问最少需要多少时间处理完(包括机器启动的时间) 思路:我们把木棒按重量从小到大排列,而且相同的重量按长度从小到大排列,然后每次选取合适的木棒加入一个集合,这个集合木棒的顺序是按重量和长度递增的,也就是说这...
阅读全文
摘要:之所以称之为“策略”,而不是“算法”,还是有些原因的,贪心思想和动态规划思想练习紧密,可是细想一下有不能混为一谈,动态规划是根据迁移过程的状态去推导下一过程的状态,是有理论依据的,通过每次“完美”的检验而得出最优解,关键是找出一个最优子结构,记得经典的一句话是:动态规划的子结构必须是独立的,而且是重叠的,虽然是一组反义词,可是...
阅读全文
摘要:我曾一直肤浅的认为贪心算法是没有什么理论基础来支撑的,是有局部最优解而导致可能的整体最优解,可是最近看了拟阵和贪心的相关,才知道,拟阵理论是贪心策略的理论基础.....拟阵拟阵是满足下列条件的一个序对M=(S,I);1)S是一个有穷的集合。2)I是S的一类具有遗传性质的非空子集族。遗传性质定义为:如果B∈I且A⊂B,那么A∈I。即若B∈I,则B是S的独立子集(独立子集的定义),且B的任意子集也都是S的独立子集。空集必为I的成员。注意,I是集合的集合。3)I满足交换性质。交换性质定义为,若A∈I,B∈I且|A|<|B|,则存在某一元素x∈B-A,使得A∪{x}属于I。(这条性质给了我们已知
阅读全文
摘要:动态规划( dynamic programming )算法是解决多阶段决策过程最优化问题的一种常用方法,难度比较大,技巧性也很强。利用动态规划算法,可以优雅而高效地解决很多贪婪算法或分治算法不能解决的问题。动态规划算法的基本思想是:将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解;对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并把答案保存起来,...
阅读全文
摘要://本题是用DP来解,大致意思是在偶数次时选择一个数为增大,//在奇数次时选择一个数为减小,可以越过不选,问最后最大//能积累多大的数。//主要是状态转移方程:s[i][2][2]来表示在奇数、偶数和选择、不选四个//状态,那么如果这一次为奇数选择,那么上一次必定是选 偶数选择 和 奇数//不选 这两个状态中最大的于是有了: s[i][0][0]=max(s[i-1][0][1],s[i-1][1...
阅读全文