
动态规划
文章平均质量分 66
f_zyj
一个追逐蝴蝶的人!
展开
-
NYOJ-17-单调递增最长子序列
描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0 < n < 20,表示有n个字符串要处理 随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 输出字符串的最长递增子序列的长度 样例输入 3 aaa ababc abklmncdefg 样例输出 1 3 7水题喽……#include原创 2016-05-18 01:13:29 · 458 阅读 · 0 评论 -
CDOJ-2016-A-柱爷与咸鱼神功
某日,喵哈哈村,柱爷在自己房间内,面对魔镜“魔镜啊,魔镜,什么才是这个世界上最强大的武功?”霎时,一道惊雷落下,柱爷的面前竟然浮现出了一本古老的黑色书籍,而书的名字竟然是“咸鱼神功” !翻开一看,书的第一页赫然写着:”练至大成可变身咸鱼王,掌控雷电! “看到这句话,柱爷当即决定修炼咸鱼神功!既然是神功,也不是那么好练的,因此柱爷决定好好的规划一下自己的修炼过程!柱爷有N N 点心情值,而咸鱼原创 2016-05-07 00:01:35 · 4915 阅读 · 0 评论 -
CDOJ-2016-B-柱爷与最大区间和
柱爷爱思考,凡事喜欢举一反三,常常能想到别人没想过的问题。 比如最大区间和这个问题:在一数列上选出一段区间,使得这段区间和最大。 柱爷想:如果选出两段区间(不相邻)会怎样呢? 柱爷很快想到了答案,你呢?Input 第一行输入一个数N,表示数组的长度。 第二行输入N个数,表示各元素的值。数据保证: 3≤N≤500000 −100#include <stdio.h>#define MAX原创 2016-05-07 04:04:28 · 1334 阅读 · 0 评论 -
NYOJ-16-矩形嵌套
描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a//问题代码,此写法有点像贪心,存在后效应性,需要用动态规划取消后效应性//从大到小开始查找,这里我们选择的不是尺寸最大的,而是可以包含(嵌套)矩形数最多的//#include <stdio.h>//#define MAX(a, b) a > b ? a : b//#define原创 2016-05-17 03:36:41 · 445 阅读 · 0 评论 -
NYOJ-15-括号匹配(二)
描述 给你一个字符串,里面只包含”(“,”)”,”[“,”]”四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。 如: []是匹配的 ([])[]是匹配的 ((]是不匹配的 ([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10) 每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100 输出 对于每组测试数原创 2016-04-23 03:40:31 · 1651 阅读 · 0 评论 -
51Nod-1085-背包问题
在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2……Wn(Wi为整数),与之相对应的价值为P1,P2……Pn(Pi为整数)。求背包能够容纳的最大价值。 Input 第1行,2个整数,N和W中间用空格隔开。N为物品的数量,W为背包的容量。(1 <= N <= 100,1 <= W <= 10000) 第2 - N + 1行,每行2个整数,Wi和Pi,分别是物品的体积和物品的价原创 2016-04-22 02:20:13 · 988 阅读 · 0 评论 -
51Nod-算法马拉松13-A-取余最长路
佳佳有一个n*m的带权矩阵,她想从(1,1)出发走到(n,m)且只能往右往下移动,她能得到的娱乐值为所经过的位置的权的总和。 有一天,她被下了恶毒的诅咒,这个诅咒的作用是将她的娱乐值变为对p取模后的值,这让佳佳十分的不开心,因为她无法找到一条能使她得到最大娱乐值的路径了! 她发现这个问题实在是太困难了,既然这样,那就只在3*n的矩阵内进行游戏吧! 现在的问题是,在一个3*n的带权矩阵中,从(1原创 2016-05-04 21:05:42 · 990 阅读 · 4 评论 -
NYOJ-1070-诡异的电梯[Ⅰ]
描述 新的宿舍楼有 N(1≤N≤100000) 层 and M(1≤M≤100000)个学生. 在新的宿舍楼里, 为了节约学生的时间也为了鼓励学生锻炼身体, 所以规定该宿舍楼里的电梯在相邻的两层之间是不会连续停下(即,如果在第2层停下就不能在第3层停下。).所以,如果有学生在相邻的两层之间要停下, 则其中的一部分学生必须选择走楼梯来代替。规定:一个人走下一层楼梯的花费为A,走上一层楼梯的花费为B。原创 2016-05-04 02:54:14 · 738 阅读 · 0 评论 -
51Nod-1134-最长递增子序列
给出长度为N的数组,找出这个数组的最长递增子序列。(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10。 Input 第1行:1个数N,N为序列的长度(2 <= N <= 50000) 第2 - N + 1行:每行1个数,对应序列的元素(-10^9 <= S[i] <= 10^9) Output 输出最长递增子序列的长度。原创 2016-04-29 03:12:47 · 1556 阅读 · 0 评论 -
NYOJ-110-剑客决斗
描述 在路易十三和红衣主教黎塞留当权的时代,发生了一场决斗。n个人站成一个圈,依次抽签。抽中的人和他右边的人决斗,负者出圈。这场决斗的最终结果关键取决于决斗的顺序。现书籍任意两决斗中谁能胜出的信息,但“A赢了B”这种关系没有传递性。例如,A比B强,B比C强,C比A强。如果A和B先决斗,C最终会赢,但如果B和C决斗在先,则最后A会赢。显然,他们三人中的第一场决斗直接影响最终结果。假设现在n个人围成一原创 2016-04-27 16:02:10 · 2000 阅读 · 5 评论 -
51Nod-1049-最大子段和
N个整数组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续子段和的最大值。当所给的整数均为负数时和为0。 例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。 Input 第1行:整数序列的长度N(2 <= N <= 50000) 第2 - N + 1行:N个整数(-10^9 <= A[i] <= 10原创 2016-04-18 20:03:46 · 442 阅读 · 0 评论 -
51Nod-1006-最长公共子序列Lcs
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。 比如两个串为:abcicba abdkscabab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。 Input 第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000) Output 输出最长的子序列,如果有多个,随意输出1个。 Input示例 abcicba原创 2016-04-15 18:08:13 · 2982 阅读 · 5 评论 -
如何实现动态规划?——TWO
忙碌了一天,是时候继续动态规划的问题了,昨天写了一些对动态规划的入门理解,尽管我文笔略差,但是自我感觉打得比方还是比较形象的;同时也转载了一个讲述动态规划的博文,但是在今天通读后,感觉这篇文章优点和缺点参半。这篇文章,优点是以一个十分形象的故事引入了动态规划,缺点却是他的故事最后把人讲蒙圈了,(也可能是个人智商问题,反正我是没有看懂为何最后要考虑到那挖矿的一万个人的每个人的分配过程,主要是讲这部分原创 2016-03-01 22:11:37 · 1558 阅读 · 3 评论 -
如何实现动态规划?——转载
碰见一个特别好的讲动态规划的帖子,转载一下下,为自己以后再学习留点好东西!网址:http://www.cnblogs.com/sdjl/articles/1274312.html详情如下:(有点长,但是很有意思,有点寓教于乐的意味,慢慢品味吧)通过金矿模型介绍动态规划—-第一节—-初识动态规划——– 经典的01背包问题是这样的: 有一个包和n个物品,包的容量为m,每个物品都转载 2016-02-28 23:26:07 · 866 阅读 · 0 评论 -
NYOJ-35-表达式求值
描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。 比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)输入 第一行输入一个整数n,共有n组测试数据(n<10)。 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结原创 2016-05-26 19:30:48 · 6142 阅读 · 3 评论 -
2016计蒜之道-初赛-第四场-A-淘宝流量分配
描述在每年的淘宝“双十一”时,访问量都会暴涨,服务器的请求会被流量分配程序按照一定策略,分发给不同的进程去处理。有一类请求,有两个进程可以接受分发的请求,其中一个进程所在服务器的配置、网络传输性能等都要优于另一个进程。流量分发程序可以知道队列中每个任务的预计处理时间,每次都会尽可能将队列中预计处理时间更多的任务分配给性能更优的进程。>>>详情请点击题解一道简单的动态规划问题,状态转移方程为:原创 2016-06-11 14:33:12 · 1548 阅读 · 0 评论 -
NYOJ-201-作业题
ACM模版描述小白同学这学期有一门课程叫做《数值计算方法》,这是一门有效使用数字计算机求数学问题近似解的方法与过程,以及由相关理论构成的学科……今天他们的Teacher S,给他们出了一道作业题。Teacher S给了他们很多的点,让他们利用拉格朗日插值公式,计算出某严格单调函数的曲线。现在小白抄下了这些点,但是问题出现了,由于我们的小白同学上课时走了一下神,他多抄下来很多点,也就是说这些点整体连线原创 2016-07-26 00:48:03 · 473 阅读 · 0 评论 -
51Nod-1174-区间中最大数
ACM模版描述给出一个有N个数的序列,编号0 - N - 1。进行Q次查询,查询编号i至j的所有数中,最大的数是多少。 例如: 1 7 6 3 1。i = 1, j = 3,对应的数为7 6 3,最大的数为7。(该问题也被称为RMQ问题)Input 第1行:1个数N,表示序列的长度。(2 <= N <= 10000) 第2 - N + 1行:每行1个数,对应序列中的元素。(0 <= S[i]原创 2016-07-26 14:54:42 · 767 阅读 · 0 评论 -
51Nod-1002-数塔取数问题
ACM模版描述题解从底层向上层推。一个简单的动态规划。代码#include <iostream>#include <cstdio>using namespace std;const int MAXN = 125300;int A[MAXN];int main(int argc, const char * argv[]){// freopen("input.txt", "r", stdi原创 2016-07-30 12:10:48 · 720 阅读 · 0 评论 -
51Nod-1009-数字1的数量
ACM模版描述题解一道动态规划题,考点是数位dp,这里提供两种异曲同工之妙的解法。虽然都是数位dp,但是思路有略微差异。代码One:#include <iostream>#include <cmath>#include <cstring>//#pragma warning(disable:4996)using namespace std;typedef long long ll;ll s;ll原创 2016-07-30 14:36:41 · 1872 阅读 · 0 评论 -
51Nod-1083-矩阵取数问题
ACM模版描述题解经典的动态规划。代码#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int MAXN = 505;int map[MAXN][MAXN] = {0};int dp[MAXN][MAXN] = {0};int main(int argc, const char * a原创 2016-07-30 20:34:12 · 366 阅读 · 0 评论 -
51Nod-1007-正整数分组
ACM模版描述题解被包装后的01背包。所有整数和最大为10000,所以只要求在sum/2的背包中,最大的价值,然后fabs(sum - dp[N][C] - dp[N][C])即为结果。代码#include <iostream>#include <algorithm>#include <cmath>#include <cstring>using namespace std;const int原创 2016-07-31 03:26:45 · 760 阅读 · 0 评论 -
51Nod-1042-数字0~9的数量
ACM模版描述题解数位dp,和51Nod 1009 数字1的数量是同类型题,方法一致。但是需要考虑的情况多了些,所以需要注意的细节也随之多了许多,一不小心,我就碰见了BUG,这个BUG,说起来好心酸,从七月找到了八月……问题在于这道题需要考虑到0的个数,而0的个数和其他的不一样,因为数字前缀必须是非0的,也就是说需要把所有0...、00...、000...等情况系数筛除。代码#include <io原创 2016-08-01 04:39:41 · 1215 阅读 · 0 评论 -
如何实现动态规划?——ONE
昨天总算是看完了数据结构的图了,今天开始搞动态规划(ps:实话说,对动态规划一点概念都没有),以下均是边学动归边做的书面整理,便于梳理自己的思路,很多都是基于一些大牛的文章做的总结。刚看到动态规划,我问了三个比较抽象的问题(也许这么问并不明智)……一:动态规划的存在的实际意义是什么(即为了解决什么问题而存在)?二:动态是什么?三:什么是规划?------------------------原创 2016-02-28 22:18:04 · 1049 阅读 · 0 评论 -
51Nod-1050-循环数组最大子段和
ACM模版描述题解这里分为两种情况: 其一:从[1, n]的正常顺序的最大子段和; 其二:从开头取一部分,结尾取一部分,中间舍去,那么中间的一定是最小子段和,然后所有数据的和减去最小子段和即可。 最后从两种情况中选取相对较大的情况。代码#include <iostream>#include <cstdio>using namespace std;typedef long long ll;co原创 2016-08-01 17:20:11 · 506 阅读 · 0 评论 -
51Nod-1051-最大子矩阵和
ACM模版描述题解这里需要格外注意的是,M和N分别指的是列数和行数,而不是行数和列数,这个能把你坑死……O(N^3)的复杂度可以过。代码#include <iostream>#include <cstdio>typedef long long ll;using namespace std;const int MAXN = 505;ll Matrix[MAXN][MAXN];int main(int原创 2016-08-02 00:08:26 · 1729 阅读 · 0 评论 -
51Nod-1489-蜥蜴和地下室
ACM模版描述题解首先将头尾的两个弓箭手打爆,然后dfs中间的弓箭手即可。 这里需要注意,每次往后搜索N+1的条件是,第N-1个弓箭手已经被A死了,但是第N个弓箭手不要求必须死。 因为这里数据很小,所以dfs暴力搜索是可以AC的……代码#include <iostream>using namespace std;const int INF = 0x3f3f3f3f;const int MAXN原创 2016-08-05 00:52:00 · 2694 阅读 · 4 评论 -
51Nod-1092-回文字符串
ACM模版描述题解逆置原字符串 和原字符串求最大公共子序列的长度 总长度减去该长度 即为所求代码#include <iostream>#include <cstring>using namespace std;const int MAXN = 1001;int dp[MAXN][MAXN];char sOne[MAXN];char sTwo[MAXN];int main(){ wh原创 2016-08-02 10:10:16 · 1066 阅读 · 0 评论 -
51Nod-1021-石子归并
ACM模版描述题解动态规划,dp[a][b]:从a到b的最小合并代价和。 动态转移方程: dp[j][i + j] = min(dp[j][i + j], dp[j][k] + dp[k + 1][i + j] + temp); 这里的temp是从j到i+j的和。代码#include <iostream>#include <cstring>using namespace std;co原创 2016-08-05 16:21:14 · 500 阅读 · 0 评论 -
51Nod-1154-回文串划分
ACM模版描述题解这道题做起来有些恶心了,一开始用Macacher算法做,但是发现扩充后的字符串划分后会出现彼此的干扰,比如ABB,扩充后,$#A#B#B#\0,这里本来只需要分为两部分,可是因为第二个#既是左边串,又是右边串的,所以互相干扰成了三部分。然后只能放弃这种思路。于是,只能自己分两种情况来考虑,一种是以pos为轴心,一种是以pos和pos+1为轴心,查找对应的回文串长度,结合动态规划即可原创 2016-08-02 16:49:14 · 720 阅读 · 0 评论 -
51Nod-1043-幸运号码
ACM模版描述题解动态规划,dp[i][j]表示i个数和为j的总数(这里包括开头为0的情况),则: dp[i][j] = dp[i - 1][j - k](k:0 to 9) 最后,我们只需要用去掉0打头的情况*没有去掉0打头的情况累加并取模即可。 ans = (ans + dp[n & 1][i] * (dp[n & 1][i] - dp[(n - 1) & 1][i])) % m原创 2016-08-05 23:57:17 · 1130 阅读 · 0 评论 -
HDU-5791-Two
ACM模版描述题解类似于最长公共子序列问题,略微不同,另外需要考虑到重复状态的去重与否。代码#include <iostream>#include <cstdio>typedef long long ll;using namespace std;const int mod = 1000000007;int a[1005], b[1005];long long dp[1005][1005];int原创 2016-08-02 22:25:27 · 643 阅读 · 0 评论 -
51Nod-1101-换零钱
ACM模版描述题解类似于0-1背包问题,属于比较常见的动态规划。不同的是,这里是13种物件儿,不是13件物件儿。代码#include <iostream>#include <cstring>using namespace std;const int SIZE = 13;const int value[13] = {1, 2, 5, 10, 20, 50, 100, 200, 500, 1000,原创 2016-08-07 15:42:02 · 833 阅读 · 0 评论 -
51Nod-1268-和为K的组合
ACM模版描述题解N比较小,深度优先搜索即可。也可以使用动态规划,典型的0-1背包问题,可是K太大,正常情况会挂,然而这道题数据比较弱,K根本不到1e9的量级。所以如果K的数据稍微一强,就会挂,可以优化超大背包,二进制枚举N/2个状态,然后筛选出所有可能存在的状态,最后再二进制枚举剩下的N-N/2个状态。(只是动态规划的思想,实际解题代码已经不像动态规划了)……代码One:// 深度优先搜索解法#原创 2016-08-10 20:18:09 · 1077 阅读 · 0 评论 -
51Nod-1270-数组的最大代价
ACM模版描述题解动态规划,极端考虑法,每个A[i]要么取1,要么取B[i]。 状态转移方程也很好推(dp[i][j]:j->0表示A[i]取1,j->1表示A[i]取B[i]): dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + B[i - 1] - 1); dp[i][1] = max(dp[i - 1][0] + B[i] - 1, dp[i原创 2016-08-10 21:31:02 · 387 阅读 · 0 评论 -
51Nod-1391-01串
ACM模版描述题解看到很多人都说这道题是哈希+dp,我看了好久才明白这里所谓的哈希只是一种思想~~~有些傻了,之前一直不知道这种思想叫做哈希。我的dp也有些差劲了,需要加强。以下思路是借鉴一个大牛的(ID:追梦赤子心):首先,我们可以预处理开头到第i个位置0的数量大于1的数量的串的最长长度sum_0[i],同理,预处理第i个位置到结尾1的数量大于0的数量的串的最长长度。那么,我们可以发现当结果[i,原创 2016-09-15 19:17:05 · 541 阅读 · 0 评论 -
51Nod-1412-AVL树的种类
ACM模版描述题解经典的dp,而我却没有想到……树的深度不大,可以实现暴力枚举深度。 设dp[i][k]表示结点个数为i,深度为k的AVL个数。那么,状态转移方程为(j表示右子树的结点数目): 1、dp[i][k] += dp[i - 1 - j][k - 1] * dp[j][k - 1] 2、dp[i][k] += 2 * dp[i - 1 - j][k - 2] * dp[j][k原创 2016-09-16 18:55:32 · 835 阅读 · 0 评论 -
背包相关
ACM模版背包相关const int MAXN = 101;const int SIZE = 50001;int dp[SIZE];int volume[MAXN], value[MAXN], c[MAXN];int n, v; // 总物品数,背包容量// 01背包void ZeroOnepark(int val, int vol){ for (int j原创 2016-08-15 01:29:21 · 1676 阅读 · 0 评论 -
51Nod-1086-背包问题 V2
ACM模版描述题解这里提供三种代码,前两种方法一致,复杂度O(V*Σlog n[i]),不同的是,第二个是模版;第三种代码最优,复杂度为O(VN),可惜十分不好理解,具体推导过程不再赘述,有些懵懵懂懂……这个问题是一道常见的多重背包问题,和完全背包相似,可以转化为01背包问题,但是转化过程中,不能简单的将第i种拆分成ci[i]个物品,要利用一些数学知识来优化,应拆分为1、2、4……c[i]-sum种原创 2016-08-15 01:40:49 · 772 阅读 · 0 评论 -
51Nod-1202-子序列个数
ACM模版描述题解一道计数DP,递推找规律,可以发现状态转移方程为: dp[i] = (dp[i - 1] * 2 + 1) % MOD; ,该元素首次出现 dp[i] = (dp[i - 1] * 2 - dp[pos[val[i]] - 1] + MOD) % MOD; ,该元素非首次出现pos[val[i]]表示val[i]上一次出现位置,然后减去以该元素为结尾的次数即可。代码#i原创 2016-08-26 23:57:53 · 816 阅读 · 0 评论