
dp
文章平均质量分 72
皮得一1
这个作者很懒,什么都没留下…
展开
-
poj 1141 Brackets Sequence(区间dp)
题意:给定一个由'(', ')', '[', 和 ']' 组成的序列,找出以该序列为子序列的最短合法序列。定义合法的括号序列如下:1 空序列是一个合法的序列2 如果S是合法的序列,则(S)和[S]也是合法的序列3 如果A和B是合法的序列,则AB也是合法的序列例如:下面的都是合法的括号序列(), [], (()), ([]), ()[], ()[()]下原创 2016-05-06 10:11:31 · 497 阅读 · 0 评论 -
poj 2955 Brackets(区间dp)
题意:给出一串由‘(‘,’)‘,’[',‘]’组成的字符串,问最多有多少个括号匹配。思路:状态:dp[i][j]表示 i 到 j 最多的匹配个数转移方程:dp[i][j] = max(dp[i][j], dp[i][k] + dp[k+1][j]);#include#include#includeusing namespace std;const int N = 105原创 2016-05-06 09:47:00 · 303 阅读 · 0 评论 -
石子合并(区间dp)
题意:有n堆石子,每堆有a[i]个,每次合并时只能合并相邻的两堆,代价为两堆石子的个数之和。问把这n堆石子合并成一堆需要的最小代价是多少。思路:状态:dp[i][j] 表示合并第 i 堆到第 j 堆石子的最小代价转移方程;dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + sum[j] - sum[i-1]);其中sum[i原创 2016-05-06 09:14:05 · 383 阅读 · 0 评论 -
hdu 2993 MAX Average Problem(斜率dp)
题意:给一个长度为 n 的序列,找出长度 >= k 的平均值最大的连续子序列。思路:1,用一个单调队列来维护解集。2,假设队列中从头到尾已经有元素a b c。那么当d要入队的时候,我们维护队列的上凸性质,即如果g[d,c]=g[x,y]为止,并将d点加入在该位置中。3,求解时候,从队头开始,如果已有元素a bc,当i点要求解时,如果g[b,a]参考博客:http://blo原创 2016-05-05 23:35:23 · 381 阅读 · 0 评论 -
hdu 3507 Print Article(斜率dp)
题意:一个打印机要输出N个数字a[N],输出的时候可以连续连续的输出,每连续输出一串,它的费用是 “这串数字和的平方加上一个常数M”。思路:我们设dp[i]表示输出到i的时候最少的花费,sum[i]表示从a[1]到a[i]的数字和。于是方程就是:dp[i]=dp[j]+M+(sum[i]-sum[j])^2;很显然这个是一个二维的。题目的数字有500000个,不用试了,二维铁定原创 2016-05-05 21:19:42 · 295 阅读 · 0 评论 -
poj 1458 Common Subsequence
题意:求最长公共子序列长度。#include #include #include using namespace std;#define MAXV 1000int same(int a,int b){ return a==b?1:0;}int max(int a,int b, int c){ if(a>=b && a>=c) return a; if(b>=a && b原创 2016-05-04 20:18:52 · 298 阅读 · 0 评论 -
poj 2533 Longest Ordered Subsequence(dp)
题意:给出一序列,求出该序列的最长上升子序列的最大长度。#include #include using namespace std;#define MAX(a,b) a>b?a:bint a[1005], dp[1005], n;int DP(){ int i, j; for (i = 1; i <= n; i++) { dp[i] =原创 2016-03-14 14:13:15 · 421 阅读 · 0 评论 -
poj 1159 Palindrome(dp+滚动数组)
题意:给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。思路:求原串与其逆串的最长公共子序列,然后用串长减去最长公共子序列的长度就是要添加的最少的字符数就是需要添加的字符数。另外还需注意的是字符串长度最长Max为5000,如果用数组maxlen[Max][Max],那么内存会超出。所以引进滚动数组,只需要定义maxlen[2][Max]就可以把问题解决了原创 2016-03-14 13:55:50 · 414 阅读 · 0 评论 -
poj 2378 Tree Cutting(树形dp)
题意:n个节点的树,删除一个点,得到的最大联通分支大小不大于总节点数的一半,求这样点的集合。#include #include #include #include using namespace std;#define N 10010int dp[N],n,num[N],used[N];vectore[N];int dfs(int root){ num[root原创 2016-03-14 13:33:14 · 574 阅读 · 0 评论 -
hdu 1069 Monkey and Banana(dp求最大高度)
题意:给定n种长方体,每种可以选择无数个,求这些长方体所能搭建的最大高度。要求放在上面的长方体的长和宽都要比下面的长方体小。思路:转换过后,此题目考察的是动态规划里的最长有序子序列。对于长方体长宽高x,y,z进行分情况处理,去除一些重复的情况。#include#includeconst int MAXN=200;using namespace std;struct Block{原创 2016-02-15 23:37:23 · 432 阅读 · 0 评论 -
hdu 1029 Ignatius and the Princess IV
题意:n个数字中找出出现次数至少为(n+1)/2的数。#include #include int A[1000000];int main(){ int n, m, i, ok; while (scanf("%d", &n) != EOF) { memset(A, 0, sizeof(A)); for (i=0; i<n; i+原创 2016-02-15 22:06:44 · 346 阅读 · 0 评论 -
hdu 1024 Max Sum Plus Plus(dp求m个不相交子段和的最大值)
本题的大致意思为给定一个数组,求其分成m个不相交子段和最大值的问题。设Num为给定数组,n为数组中的元素总数,Status[i][j]表示前i个数在选取第i个数的前提下分成j段的最大值,其中1Status[i][j]=Max(Status[i-1][j]+Num[i],Max(Status[0][j-1]~Status[i-1][j-1])+Num[i])乍看一下这个方程挺吓人的,因为原创 2016-02-15 21:40:48 · 533 阅读 · 0 评论