DP
文章平均质量分 95
Hearthougan
这个作者很懒,什么都没留下…
展开
-
动态规划总结
动态规划(Dynamic Programming, DP)思想启发于分治算法的思想,也是将复杂问题化解若干子问题,先求解小问题,再根据小问题的解得到原问题的解。但是DP与分治算法不同的是,DP分解的若干子问题,往往是互相不独立的,这时如果用分治算法求解,那么会对重叠子问题重复进行求解,从而使得浪费大量的时间。那么如果我们保存已经计算过的子问题的解,这样当再次计算该子问题时,可以直接使用,这样可...原创 2016-12-20 04:00:18 · 7707 阅读 · 0 评论 -
Nyoj 515 完全覆盖 II
详细可以参考:http://blog.csdn.net/hearthougan/article/details/22077391 #include <iostream>#include <cstdio>#include <cstring>using namespace std;typedef long long LL;LL dp[12]...原创 2014-03-27 12:09:22 · 1089 阅读 · 0 评论 -
Nyoj 469 擅长排列的小明 II
/**由于第一个只能是1,则第二个数只能是2,3当第二个数是2时,则相当于是对2-n的排列,相当于对1-(n-1)的排列,即arr[n-1];当第二个数是3时,第三个数只能是2,4,5此时,当第三个数为2时,则是对3-n的排列,相当于对1-(n-3)的排列,即arr[n-3] 当第三个数为4时,此时,第四个数只能是2,除了n等于4时,对于n大于4的排列,都不符合要求, 而n...原创 2014-03-26 16:05:51 · 660 阅读 · 0 评论 -
Nyoj 456 邮票分你一半
深搜超时了,但是http://blog.csdn.net/hearthougan/article/details/21940999这个题,却可以!只有利用0-1背包的思想来求解了;0-1解法:#include <iostream>#include <cstring>#include <cstdio>using namespace std;...原创 2014-03-26 14:59:52 · 791 阅读 · 0 评论 -
NYOJ 15 括号匹配(二)
题目来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=15这个是很早之前写的,今天又从新敲了一遍! dp[i][j]表示:从第i个位置到第j个位置至少要添加的括号数目,我们令dp[i][i]表示当前到当前位置至少添加一个括号,假如只有一个括号,那么dp[i][i] = 1;dp[i][j]: 如果从第i个位置到第j...原创 2014-04-07 16:30:12 · 1000 阅读 · 0 评论 -
hdu 4502 吉哥系列故事——临时工计划
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=4502本题是动态规划,dp[i]表示到今天所能挣到最多的钱,dp[i] = MAX(dp[i], dp[j] + a[j+1][i]);其中a[i][j]表示:从i到j天的工资! #include <iostream>#include <cstdio>#incl...原创 2014-04-21 20:15:46 · 820 阅读 · 0 评论 -
Nyoj 435 棋盘分割(二)
主要还是参考周伟同学写的状态压缩思想:http://download.csdn.net/detail/hearthougan/7045453另外可以参考一下相对简单的同类型题:http://blog.csdn.net/hearthougan/article/details/22077391首先交代一下所要用得到几个变量:i, j, curstatus, prestatus, b1, b2;...原创 2014-03-26 14:02:27 · 775 阅读 · 0 评论 -
Nyoj 201 作业题
#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>using namespace std;const int MAXN = 1000;struct Node{ int x; int y;};Node Point[MAXN]...原创 2014-03-18 16:02:48 · 766 阅读 · 0 评论 -
NYOJ 289 (0-1背包)
#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int MAXN = 1010;int MAX(int a, int b){ return a > b ? a : b;}int dp[MAXN];int V;...原创 2014-03-23 20:49:57 · 856 阅读 · 0 评论 -
Nyoj 246
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int MAXN = 110;int MAX(int a, int b){ return a > b ? a : b;}int Row_Col(char s)...原创 2014-03-23 15:44:04 · 732 阅读 · 0 评论 -
Nyoj 325
//利用搜索来实现在均分(意思就是这个人的多少,多方就得多少)的情况下,使得两堆误差最小(总的质量之和减去两者均分量之和,就是在此种均分情况下的两堆差量)!#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int MAXN = 25;...原创 2014-03-24 11:19:34 · 744 阅读 · 0 评论 -
NYOJ 311 完全背包
#include #include #include using namespace std;const int MAXN = 50010;const int MIN = -0xfffffff;int dp[MAXN], V;void Complete_Pack(int cost, int price){ int v; for(v = cost; v <原创 2014-03-23 20:47:06 · 749 阅读 · 0 评论 -
Nyoj 269
首先题目读的费劲!另外不能在for循环中定义变量i,j之类的,否则会超时!!!dp[i][j] += dp[i-1][j-k], i >= 2,j #include #include #include using namespace std;const int MAXN = 82;int dp[10][MAXN];//dp[i][j]前i位之和等于j的数目void原创 2014-03-23 18:12:19 · 728 阅读 · 0 评论 -
Nyoj 252
dp[k],表示长度为k满足题目条件的‘01’串,有几个。如果第k位为0,则dp[k] = dp[k-1],如果第k位为1,那么第k-1位一定为0,则dp[k] = dp[k-2]; #include <iostream>#include <cstring>#include <cstdio>using namespace std;const...原创 2014-03-23 10:28:57 · 927 阅读 · 0 评论 -
Nyoj 492 king
跟铺砖问题或者棋盘分割问题差不多,相同的思路来做!首先交代一下DFS中变量的含义:i, j, curstatus, prestatus, num, b分别为:当前所在的行,j当前所在的列, curstatus当前所在行的状态,prestatus当前所在列所在行的前一行状态,num,本行放置king的方案数, b本行本列的放置是否对下一列有影响。dp[i][curstatus][num]:表...原创 2014-03-27 10:43:08 · 871 阅读 · 0 评论 -
Nyoj 37 回文字符串
题目来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=37用滚动数组对比正常的LCS:http://blog.csdn.net/hearthougan/article/details/21237351如果本题时间或者空间约束的再严一点,正常的LCS就不行了!需考虑节约内存! #include <iostream>...原创 2014-04-07 17:17:51 · 815 阅读 · 0 评论 -
nyoj 740 “炫舞家“ST
题目来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=740参考算法艺术与信息学竞赛:http://download.csdn.net/detail/hearthougan/5907359第118页。这里就不再赘述了。 #include <iostream>#include <cstring>#incl...原创 2014-05-09 12:45:12 · 1212 阅读 · 0 评论 -
动态规划之详细分析0-1背包问题
题目: 有 N 件物品和一个容量为 V 的背包。第 i 件物品的费用是 w[i],价值是 p[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 本文按照动态规划的标准模式解析:http://blog.csdn.net/hearthougan/article/details/53749841 0-1背包问题,表示的是每个物品只有一件,每件物品不能分割...原创 2016-12-26 01:50:32 · 35598 阅读 · 14 评论 -
经典动态规划引例--矩阵链相乘
这个感觉有必要说一下,因为很多经典的问题都是以它为根基扩展的,譬如:石子合并类型的。 给定由n个要相乘的矩阵构成的序列:<A1, A2, A3···An>,要计算乘积:A1*A2*A3*····An ---- <1>为了计算<1>式乘积,我们知道矩阵相乘是满足结合律的,故无论怎么添加括号,都会产生相同的结果。例如:矩阵链<A1, A2,...原创 2014-05-15 13:54:37 · 3175 阅读 · 0 评论 -
Nyoj 214 单调递增子序列(二)
以前那种写法是超时的,看别人的想法之后,才发现还有O(n*logn)的算法,这种想法挺不错的! /**#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int MAXN = 100010;int main(){ int...原创 2014-03-19 16:58:33 · 561 阅读 · 0 评论 -
九度 1390 矩形覆盖
题目来源:http://ac.jobdu.com/problem.php?pid=1390本题我用两种方法写了一下,一种是状态压缩,另一种是很简单的斐波那契数,规律其实很简单:不妨设f(n)为:n时的铺设方式数目,则:(1)如果第n行是竖着放时,那么它影响到倒数第二行的放置且只有一种情况,即这两列都是竖着放置,占据倒数第二行和最后一行,则剩余n-2行有f(n-2)种;(2)如果第n...原创 2014-05-13 16:36:18 · 719 阅读 · 0 评论 -
Nyoj 745 蚂蚁的难题(二)
题目来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=745求首尾相接圆环的连续字段最大和与首尾不相接的最大字段和中最大的那一个。 对于一个环状的数组,求其最大的字段和:(1)如果直线型数组(即:首尾不相接的数组)的最大子段和是最大的子段和,那么按寻常的dp方法可以求解。(2)如果最大子段和不是情况(1),那么既是最大子段和跨...原创 2014-05-12 21:42:50 · 1496 阅读 · 0 评论 -
九度 1011 最大连续子序列
题目来源:http://ac.jobdu.com/problem.php?pid=1011 找出最大连续子段和,如果存在多个,输出起始点最小的那个,这个限制就多需要用两个中间变量qs, qe,来存储每个最大字段的起始点,和终止点,如果存在多个最大和相同的话,这个iStartPos, iEndPos存储的就是最初的那个最大子段和的起始点qs,终止点qe! #include <...原创 2014-05-13 21:03:03 · 971 阅读 · 0 评论 -
NYOJ 104 最大和
参考别人的思路:这道题可以看做是一维最大子串和。eg:5 -3 3 -8 10 -3 5 8 -6这个数列中,最大的子串和是10 -3 5 8 = 20。当时采用的是用一个b[i]来记录:扫描到第i个元素时,其最大子串和:其递归式是:b[i]=max{a[i],b[i-1]+a[i]} 这道题中,我们需要将二维的压缩成一维,然后进行如上算法,以本题为例,其步骤如下:...原创 2014-03-16 12:05:03 · 908 阅读 · 0 评论 -
zoj 1100
题目来源:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=100现在换一种方式来写这个状态压缩我们先把第0行铺满,然而其余每一行的状态都可以由前一种状态转移而来。我们令第0层全部铺满,只有一种情况,当0 <= i < row时,我们有如下方程: 第0行铺满的状态为(1<<col)-1,铺设...原创 2014-04-10 14:42:12 · 898 阅读 · 0 评论 -
Nyoj 983 首尾相连数组的最大子数组和
题目来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=983参考:http://blog.csdn.net/hearthougan/article/details/25654383 <strong>#include <iostream>#include <cstring>#include &...原创 2014-05-13 14:58:40 · 1012 阅读 · 0 评论 -
poj 2411 zoj1100
参考周伟的论文:http://download.csdn.net/detail/hearthougan/7045453第i行的铺设方法,例如(i, j)位置的铺设受到(i-1,j), (i, j-1)影响,因此(i, j)的铺设可能影响到(i-1, j+1), (i, j+1)位置的铺设.首先交代几个变量的含义:j, curstatus, prestatus,分别表示当前为第j列,当前第i...原创 2014-03-25 17:35:37 · 1437 阅读 · 0 评论 -
Nyoj 737 石子合并(一)
石子合并问题,就是矩阵链连乘的一个推广,或者说是变形,因此矩阵链连乘,是一个根基,需要理解透彻 。因此可参考矩阵链连乘:http://blog.csdn.net/hearthougan/article/details/25834141 #include <iostream>#include <cstring>#include <cstdio>...原创 2014-03-29 21:50:02 · 1370 阅读 · 0 评论 -
nyoj 742 子串和再续
题目来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=742 #include <iostream>#include <algorithm>#include <cstring>#include <climits>#include <cstdio>using nam...原创 2014-05-09 15:42:21 · 957 阅读 · 0 评论 -
Nyoj 571 整数划分
第一行:将n划分成若干个正整数之和的划分数 我们设dp[i][j] 表示将正整数i划分成最大数不超过数j的划分数,显然我们有: (1):如果划分的数中至少有一个有j,则有:dp[i][j] = dp[i-j][j]; (2):如果划分的数中没有j,则有:dp[i][j] = dp[i][j-1]; 因此有:dp[i][j] = d...原创 2014-03-28 16:01:46 · 871 阅读 · 0 评论 -
NYOJ 236
先排序,找出最长递减序列;题目: http://acm.nyist.net/JudgeOnline/problem.php?pid=236 #include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;...原创 2014-03-22 23:07:20 · 714 阅读 · 0 评论 -
nyoj 232
长和宽按降序排列,最后找出最长降序子序列; #include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int MAXN = 100;struct Edge_Of_Rectangle...原创 2014-03-21 11:44:47 · 565 阅读 · 0 评论 -
hdu 37
#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 110;int MAX(int a, int b){ return a > b ? a : b;}struct Program_Time...原创 2014-03-15 12:33:07 · 623 阅读 · 0 评论 -
Nyoj 49 开心的小明
#include <iostream>#include <cstring>using namespace std;const int MAXN1 = 30;const int MAXN2 = 30000;int main(){ int T; int Pri[MAXN1], Im[MAXN1]; int dp[MAXN2]; ...原创 2014-03-14 21:10:52 · 767 阅读 · 0 评论 -
Nyoj 37 回文字符串
求至少添加多少字符可以构成回文字符串(自身的逆转与自身的最长公共子序列,为其本身),如果把自身逆转,再求他们的最长公共子序列,那么用他们字符串长度减去最长公共子序列长度,即为所求。 #include <iostream>#include <cstring>using namespace std;const int MAXN = 1010;in...原创 2014-03-14 15:00:15 · 797 阅读 · 0 评论 -
Nyoj 44
#include <iostream>#include <cstring>using namespace std;const int MAXN = 1000010;int main(){ int T; int n; int dp[MAXN]; int num, MAX; int i; cin>>T;...原创 2014-03-14 16:12:22 · 789 阅读 · 0 评论 -
Nyoj 36
#include <iostream>#include <cstring>using namespace std;const int MAXN = 1010;char str1[MAXN], str2[MAXN];int dp[MAXN][MAXN];int MAX(int a, int b){ return a > b ? a : b...原创 2014-03-14 13:17:48 · 675 阅读 · 0 评论 -
NYoj 16
先排序,再用一下dp #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 1010;struct Rectangle{ int len; int wide; Rectangle() { l...原创 2014-03-14 13:21:16 · 778 阅读 · 0 评论 -
Nyoj 18 其实也就是杭电上的数塔
#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int MAXN= 110;int MAX(int a, int b){ return a > b ? a : b;}int main(){ int dp[MAXN]...原创 2014-03-14 13:19:27 · 675 阅读 · 0 评论 -
hdu 1028
#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int MAXN = 125;int dp[MAXN][MAXN];//动态规划/**dp[i][j], 表示用不大j的正整数表示i;有下列几种情况:<1>:当 i &...原创 2014-03-07 11:30:40 · 747 阅读 · 0 评论