
DP
文章平均质量分 65
xxx_bug
这个作者很懒,什么都没留下…
展开
-
poj 1953 World Cup Noise
一道DP水题,主要是自己YY找出规律,就水!#include #include using namespace std;int main(){ int p[46],i,n,d; p[1] = 2; p[2] = 3; for(i =原创 2011-10-04 00:59:42 · 362 阅读 · 0 评论 -
CF 4D Mysterious Present
dfs题!!用Dp!可是就这么简单的思路,我偏偏绕远路,用LCS来DP求,被无情的MLE!#include#includeusing namespace std;int dfs(int);int w[5001],h[5001],d[5001],p[5001],n;main(){ cin>>n; for(int i=0;i<=n;i++) cin>>w[i]>>h[i]; m原创 2012-03-30 19:14:02 · 510 阅读 · 0 评论 -
ZOJ Problem Set - 1953 Advanced Fruits
简单的LCS,后面的输出要注意写好!直接套用算导的模板。#include #include #include #include #include #include #include #include #include #include using namespace std;int dp[110][110],cot[110][110],i,j;string a,b原创 2012-04-11 16:59:44 · 560 阅读 · 0 评论 -
NKOJ 1137 石子合并
被描述搞得非常凌乱~还是简单的DP,很经典的DP,听说有很多变形!#include #include #include #include #include #include #include #include #include #include using namespace std;int n,a[110],ma[110][110],mi[110][110];int原创 2012-04-16 21:25:13 · 459 阅读 · 0 评论 -
hdu 2845 Beans
简单的DP!求最大不连续子序列和,递推式也是很简单dp[i] = max(dp[i-2]+a[i],dp[i-1]);#include #include #include #include #include #include #include #include #include #include using namespace std;int vol[200010],原创 2012-04-16 19:27:19 · 346 阅读 · 0 评论 -
UVa 10003 Cutting Sticks
明显的DP!思路:每段木棍每次会被切成两段。那么我们就可以Dp不同长度的木棍。例如:10米长的木棍,切成3段,2,4,7;长度为1的有[0,2],[2,4],[4,7],[7,10],而这些段的值为0,因为不用切了。长度为2的为[0,4],[2,7],[4,10],依次类推。而每段长度可以拆成两段,选最小值,然后加上这段木棍的长度。最后就能得到ans!!#include #inclu原创 2012-05-01 21:56:53 · 536 阅读 · 0 评论 -
UVA 562 Dividing coins
求出所有的组合就行。if(a[j-m[i]) a[j] = 1;常用到的递推式求所有可能~~#include #include #include #include #include #include #include #include #include #include using namespace std;int main(){ bool a[500原创 2012-05-04 01:09:54 · 652 阅读 · 0 评论 -
UESTC 1655 Journey
求遍历所有点的最短时间。点是围成一个圈的,所以容易搞。 #include #include #include #include #include #include #include #include #include #include using namespace std;long long dp[1010][1010][2];long lo原创 2012-05-06 01:29:16 · 467 阅读 · 0 评论 -
ZOJ Problem Set - 2319 Beautiful People || sgu 199
这题WA了 21 次~~ 终于过了~用到了求最长升序序列的O(nlgn) 解法!可能是我的二分写的有问题吧~这题我到现在还是不知道为什么会在test 18 WA!算法很多人都知道~这里要注意的是排序先按s升序,再按b排序。真是不知道为什么那么多OJ都是不给test 数据的~ 让人如此浪费时间又得不到真正的提高。像我现在就是不知道test 18 和 test 27的错!于是我就得原创 2012-05-09 13:36:12 · 1550 阅读 · 1 评论 -
soj 1001. Alphacode
这题感觉出得不错,中大的确靠谱啊有木有!问题:给出由0-9组成的序列,而1 - 26 对应的是a-z。求出decode的种数!思路:dp。1、如果一段序列中出现了0,>3的数,明显,这些数是不能和后面的数组合的,所以应该将之分开。分成类似11111111这样的段,1122,2211,这些也类似!(有点难表述)。于是这样的段的情况数可分为两种情况,到n位时,(1)s[n] 独立算一个字原创 2012-05-28 21:27:02 · 772 阅读 · 0 评论 -
hdu 1421 搬寝室
先排序。因为相邻的两个数平方肯定是最小的。然后一个一个地增长DP。判断是否要保留。DP要注意枚举状态,把全部状态做出来,我们分析的时候容易从一方面切入,但是我们要后面的实现时要全面的枚举。这题还可以优化一下空间,要滚动数组。#include #include #include using namespace std;int dp[2001][1002];int a[200原创 2012-03-26 19:02:50 · 399 阅读 · 0 评论 -
hdu 1176免费馅饼
#include #include #include using namespace std;int max3(int a,int b,int c){ return max(a,max(b,c));}int dp[11][100010];int main(){ int i,j,n,e,t,m; while(scanf("%d",&n)!=EOF&&n)原创 2012-03-26 18:57:43 · 405 阅读 · 0 评论 -
ZOJ Problem Set - 1986 Bridging Signals
一道蛮好的题~~求最长非降序子序列的长度,因为数据是40000,如果用经典的O(n^2)就会TLE。 在网上搜到了一中nlgn的,不错。很好理解的一种算法。在n^2的基础上,仔细地考虑每一步就可以看出,其实我们要用到的只是找到那个符合比num[i]小的值罢了,所以只要维护好opt就好了。这样就可以用到二分查找算法提高效率。#include #include #include原创 2011-11-08 18:03:02 · 428 阅读 · 0 评论 -
HDU2602 Bone Collector
0/1背包~~回顾下背包~~#include #include #include using namespace std;int main(){ int dp[1001],val[1001],vol[1001],cas,i,j,n,v; scanf("%d",&cas); while(cas --) { scanf("%d%d",&n原创 2012-01-25 16:31:00 · 360 阅读 · 0 评论 -
HDU1114 Piggy-Bank
完全背包~~#include using namespace std;int main(){ int cas,w1,w2,dp[10001],vol[501],val[501],i,j,n; cin>>cas; while(cas --) { cin>>w1>>w2>>n; for(i = 0;i < n;i ++)原创 2012-01-25 17:07:43 · 376 阅读 · 0 评论 -
POJ 3176 Cow Bowling
//简单数塔//#include #include #include using namespace std;int main(){ int dp[360][360],i,j,n; while(scanf("%d",&n)!=EOF) { for(i = 0;i < n;i ++) for(j = 0;j < i+1;j原创 2012-01-27 20:08:39 · 364 阅读 · 0 评论 -
RQNOJ(- - !)合唱队形
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1Ti+1>…>TK(1输入的第一行是一个整数N(2输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。8186 186 150 200 160 1原创 2012-01-24 20:47:15 · 602 阅读 · 0 评论 -
HDU 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
多重背包~~ O(V*Σlog n[i]) version ~~#include #include using namespace std;int main(){ int cas,n,v,i,j,k,dp[101],val[101],vol[101],num[101]; scanf("%d",&cas); while(cas --) {原创 2012-01-25 17:25:23 · 1038 阅读 · 0 评论 -
poj 1159 Palindrome
DP,简单的回文词问题。有两种做法!第一种做法是用LCS来做。因为Maxlen = 5000;所以要用滚动数组,其实我用short型也能过~~#include #include using namespace std;short dp[2][5001];int main(){ string s,cs; int i,j,n,e; while(cin>>n原创 2012-01-28 19:46:15 · 312 阅读 · 0 评论 -
ZOJ Problem Set - 1093 Monkey and Banana
先写了一个好大量内存的O(n^3)的代码,TLE~ 贴下,看看能不能再优化。#include #include using namespace std;struct block{ int het; int len; int wid;};block dp[100],dp1[2][2000000];int main(){ int x,y,z,n,i,原创 2012-02-03 22:20:14 · 395 阅读 · 0 评论 -
ZOJ Problem Set - 1463 Brackets Sequence
刘汝佳书的DP例1。很经典,搜了下题解,发现刘书的算法还有优化的地步,就是[ s' ,s'] 中间这些情况是可以不用写的,冗余了。因为在最后一步分部分比较时就能做到了。此题的一个初始化条件,dp[i][i] = 1;用一个数组来存放增加符号的地方,再递归地输出就可以了~~#include #include #include using namespace std;int原创 2012-02-25 14:53:52 · 433 阅读 · 0 评论 -
HDU 1003 Max Sum
这题是很经典的题目。是体现思维灵活度的好题目。题意略。现在我们来分析一下。如果全部都是正整数,那么显然应该全部都选才是最大值。如果全部都是负数,则应该选一个最大的负数。也其实就是说,如果前面的数合并在一起时是正数,那么这后面的数应该合并它才能有更大值。如果前面的数合并后是负数,那么合并它就变小。按照这样的思路就可得出结果了~#include #include #include原创 2012-07-06 12:28:18 · 361 阅读 · 0 评论