随笔分类 -  动态规划、记忆化搜索

摘要:心血来潮想刷刷题玩,想起leetcode,注册登录,知道leetcode上的题都比较简单,就勾选难度为“困难”,然后看到此题。 读完题,心想这标为“困难”,该不会是得用DFA甚至NFA吧? 又仔细看了下测试数据,数据量不大,直接搜索吧,暴搜如果超时,再考虑剪枝或者加记忆化。 花了二十多分钟敲完代码, 阅读全文
posted @ 2022-12-03 04:06 moonbay 阅读(41) 评论(0) 推荐(0)
摘要:挺简单的动态规划题。我用记忆化搜索打的。直接上代码:/* * Author : ben */#include #include #include #include #include #include #include #include #include #include #include #i... 阅读全文
posted @ 2015-06-05 21:47 moonbay 阅读(133) 评论(0) 推荐(0)
摘要:给一个数列,问最少修改多少个元素使数列严格递增。如果不是要求“严格”递增,那就是求最长不降子序列LIS,然后n-LIS就是答案。要严格递增也好办,输入的时候用每个数减去其下标处理一下就行了。/* * Author : ben */#include #include #include #incl... 阅读全文
posted @ 2015-05-31 19:29 moonbay 阅读(192) 评论(0) 推荐(0)
摘要:n^2的算法就行,很简单的动态规划。直接上代码/* * Author : ben */#include #include #include #include #include #include #include #include #include #include #include #incl... 阅读全文
posted @ 2015-02-07 22:38 moonbay 阅读(149) 评论(0) 推荐(0)
摘要:就是最大子段和的变体。最大子段和只要一个数组,记录前i个里的最大子段和在f[i]里就行了,但是最大子段积因为有负乘负得正这一点,所以还需要把前i个里的最小子段积存起来。就可以了。直接上代码:/* * Author : ben */#include #include #include #incl... 阅读全文
posted @ 2015-01-30 19:02 moonbay 阅读(473) 评论(0) 推荐(0)
摘要:挺水的动态规划,只要依次枚举子树的个数即可。/* * hdu4472/win.cpp * Created on: 2012-11-17 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include <iostream>#include <algorithm>#include <queue>#include <set>#includ 阅读全文
posted @ 2012-11-17 18:38 moonbay 阅读(735) 评论(0) 推荐(1)
摘要:很简单的DP,我用记忆化搜索打的~~/* * hdu2151/win.cpp * Created on: 2012-11-2 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include <iostream>#include <algorithm>#include <queue>#include <set>#include < 阅读全文
posted @ 2012-11-02 17:34 moonbay 阅读(121) 评论(0) 推荐(0)
摘要:这题两年前就看到了,据说就一个公式而已,可是我不会推,所以一直放到现在。可是今天推来推去,还是推不出那个公式,所以最后还是用DP做了。我能推出来的部分很简单,就是指数型母函数,f(x) = (1 + x^2/2! + x^4/4! + ... )^2 * ( 1 + x + x^2/2! + x^3/3! +... )^2,公式就是x^n项的系数了,可是这个我不会,求路过的大牛指点…… 阅读全文
posted @ 2012-10-31 17:06 moonbay 阅读(110) 评论(0) 推荐(0)
摘要:其实这题算动态规划有点牵强,因为它最大的难点和突破点在于把问题进行转化。我的做法是,先数出字符串的总数total和'A'的数目anum,然后只要在字符串中找出长度为anum的连续一段,它的'A'数最多就行了(假设是maxnum,则最后结果就是anum-maxnum)。找这个包含最多'A'的段才用到动态规划,其实挺简单的,就是循环一次记录从每个点起始往右长度为anum的段中'a'的数目即可。/* * hdu3819/win.cpp * Created on: 2012-10-29 * Author : ben */#include 阅读全文
posted @ 2012-10-29 16:35 moonbay 阅读(156) 评论(0) 推荐(0)
摘要:这题看完感觉就是DP,然后我当然就用记忆化搜索打了,打着打着,觉得想法不一定对,但打完交了一遍,MLE,改小数组再交,就过了,但其实还没有完全理解透。算是混过的。相当于DP的方法,dp[i][j]表示前i根筷子组成j组的最小值。我觉得关键的问题在于要先反着排序,然后如果筷子数刚好是人数的3倍时,最小的两根必定会在同一组中,且是一组中的较小的两根。/* * hdu1500/win.cpp * Created on: 2012-7-27 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstr 阅读全文
posted @ 2012-07-27 23:11 moonbay 阅读(186) 评论(0) 推荐(0)
摘要:一看就可以用母函数做,不过好久没练DP了,所以还是用DP做了。用dp[i][j]表示前i种石头排出j个出来的种数,当考虑第i种石头石,枚举其使用的个数即可。WA了好几次,是整数相乘精度的问题,使用long long就过了。/* * hdu1004/win.cpp * Created on: 2012-7-24 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include < 阅读全文
posted @ 2012-07-24 19:33 moonbay 阅读(186) 评论(0) 推荐(0)
摘要:题目简单,直接贴代码/* * hdu1398/win.cpp * Created on: 2011-10-23 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include <iostream>#include <algorithm>#include <queue>#include <set>#include <map> 阅读全文
posted @ 2011-10-23 16:57 moonbay 阅读(176) 评论(0) 推荐(0)
摘要:这题可以用最大流做,为了练DP就用状态压缩了。我一开始只想到一个O(n*2^n*2^n)的方法,效率太低,看了某大牛的解题报告后,才将算法优化到O(n^2*2^n)。不过就这样还WA了好几次,原因是代码中一句if ((k & t) == 0)我开始写成了if (k & t == 0)没有注意到位运算符的优先级是低于逻辑运算符的,谨记谨记!/* * hdu1565/win.cpp * Created on: 2011-10-4 * Author : ben */#include <cstdio>#include <cstdlib>#include < 阅读全文
posted @ 2011-10-05 09:54 moonbay 阅读(168) 评论(0) 推荐(0)
摘要:应该说,就是道DP题,最近用记忆化搜索用得老爽了,就用了~/* * hdu1521/win.cpp * Created on: 2011-10-3 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorithm>#include <iostream>#include <queue>using namespace std;const int MAXN = 12;con 阅读全文
posted @ 2011-10-03 16:11 moonbay 阅读(181) 评论(0) 推荐(0)
摘要:我的第一道记忆化搜索题。这题是一个经典问题,网上搜解题报告大多是直接说用记忆化搜索,然后就贴代码了。我花了老大劲才弄明白记忆化搜索是咋回事。其实记忆化搜索也就是搜索,只不过用了DP的思想,开了状态数组以避免普通搜索过程中对状态的重复运算,从而大大提高了效率。/* * hdu1078/win.cpp * Created on: 2011-10-1 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <alg 阅读全文
posted @ 2011-10-01 19:51 moonbay 阅读(217) 评论(0) 推荐(0)
摘要:对于每一个直方块,只要能知道以它的高度往左(往右)最大能走多少,再枚举一遍所有的直方块即可。而往左(往右)最大能走多少可以用动态规划的方法实现,开数组left(right),对于每一个方块,初始left[i](right[i])为i,然后用迭代的方法往左(右)看,即可求出。思路想出来了,代码就很简单了。/* * hdu1506/win.cpp * Created on: 2011-10-1 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cm 阅读全文
posted @ 2011-10-01 14:17 moonbay 阅读(187) 评论(0) 推荐(0)
摘要:比赛的时候,俊祥一说题目,我就马上意识到是动规,当时我正打着那道悲剧的题目,就让海峰打了,他二十来分钟吧就打完,而且一遍就过了。昨天晚上我再打这题,打了四十分钟,还WA了好几次才过。海峰真是强啊,佩服佩服!/* * hdu4001/linux.cpp * Created on: 2011-9-5 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorithm>using namespace 阅读全文
posted @ 2011-09-06 09:28 moonbay 阅读(172) 评论(0) 推荐(0)
摘要:这题完全是看解题报告做出来的,之前完全没有这样的思路, DP数组的含义还是挺好理解的,后面使用的时候反而是想了好久才理解……/* * hdu3555/linux.cpp * Created on: 2011-8-30 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorithm>using namespace std;typedef long long I64;typedef unsig 阅读全文
posted @ 2011-08-30 16:25 moonbay 阅读(201) 评论(0) 推荐(0)
摘要:#include <stdio.h>#include <string.h>#include <math.h>#define MAX_DAY 200#define MAX_STATUS 65536#define MAX 0x7ffffffchar course[20][105];int deadline[20], needtime[20];int dp[MAX_STATUS], curday[MAX_STATUS], last[MAX_STATUS];void pretreat(int maxstatus, int N) { int i, j, yw; mem 阅读全文
posted @ 2011-07-19 14:20 moonbay 阅读(234) 评论(0) 推荐(1)