随笔分类 -  acm-dp

Codeforces Round #214 (Div. 2) c题(dp)
摘要:C. Dima and Saladtime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputDima, Inna and Seryozha have gathered in a room. That's right, someone's got to go. To cheer Seryozha up and inspire him to have a walk, Inna decided to cook something.Dima a 阅读全文

posted @ 2013-11-25 17:06 后端bug开发工程师 阅读(405) 评论(0) 推荐(0)

RMQ(dp)
摘要:我一开始是不知道有这么个东西,但是由于最近在学习后缀数组,碰到一道题需要用到后缀数组+RMQ解决的所以不得不学习了。原理:用A[1...n]表示一组数,dp[i][j]表示从A[i]到A[i+2^j-1]这个范围内的最大值或者最小值也就是以A[i]为起点连续2^j个数的最大值或者最小值,由于元素个数为2^j个,所以从中间平均分成两部分,每一部分的元素个数刚好为2^(j-1)个。整个区间的最大值一定是左右两部分最大值的较大值,满足动态规划的最优原理。状态转移方程为:dp[i][j]=min(dp[i][j-1],dp[i+2^(j-1)][j-1]);边界条件为:dp[i][0]=a[i];这样 阅读全文

posted @ 2013-08-10 09:43 后端bug开发工程师 阅读(369) 评论(0) 推荐(0)

hdu 2059(dp)
摘要:题意:容易理解...思路:dp[i]表示乌龟到达第i个充电站时最少花费时间到第 i 个充电站后,从起点开始遍历到第 i-1 个充电站,得到最少花费时间状态转移方程:dp[i]=min(dp[j]+time(j-->i)); 1#includeint main(){ int i,j,n; double l,c,t,vr,v1,v2,temp,len,min; double a[105],dp[105]; while(scanf("%lf",&l)!=EOF) { scanf("%d%lf%lf",&n,&c,&t); 阅读全文

posted @ 2013-07-28 22:40 后端bug开发工程师 阅读(279) 评论(0) 推荐(0)

hdu 1421(dp)
摘要:题意:容易理解...思路:假设开始算出搬了k次的最小疲劳度,然后推出搬k+1次最小的疲劳度。代码实现:#include#include#include#includeusing namespace std;int min1[2001],dp[2001];int main(){ int n,k,i,j,a[2001],b[2001],temp,res; while(scanf("%d%d",&n,&k)!=EOF) { for(i=1;i=2*(i+1)) min1[j]=temp; if(j==... 阅读全文

posted @ 2013-07-28 22:22 后端bug开发工程师 阅读(217) 评论(0) 推荐(0)

hdu 2845(dp基础题)
摘要:题意:容易理解。分析:以后碰到这种类型的题,就要考虑把矩阵先按行来处理,再按列处理。先算出每行能够能够得到的最大值,然后按列处理即可。代码实现:#include#includeint n,m;int a[200005],dp[200005][2],b[200005];int max(int x,int y){ return x>y?x:y;}int main(){ int i,j,res; while(scanf("%d%d",&n,&m)!=EOF) { res=-1000000; dp[0][0]=0;dp[0][1]=0; ... 阅读全文

posted @ 2013-07-28 19:34 后端bug开发工程师 阅读(415) 评论(0) 推荐(0)

hdu 2870(dp求最大子矩阵)
摘要:题意:让你求的是由同一字母组成的最大子矩阵,w可以变成a或者b,x可以变成b或者c,y可以变成a或者c,z可以变成a或者b或者c。分析:这是hdu 1506、hdu 1505的加强版,具体的分析看我的博客:http://www.cnblogs.com/jiangjing/p/3221423.html代码实现:#include#include#include#includeusing namespace std;char str[8]={'a','b','c','w','x','y','z&# 阅读全文

posted @ 2013-07-28 19:23 后端bug开发工程师 阅读(322) 评论(0) 推荐(0)

hdu 1505(dp求最大子矩阵)
摘要:题意:就是让你求出全由F组成的最大子矩阵。分析:这是hdu 1506的加强版,只不过这道题变成了2维的,那我们就一行一行的来。具体的分析见1506的博客:http://www.cnblogs.com/jiangjing/p/3221423.html然后做了这题之后,就可以做下这道题的加强版了:hdu 2870代码实现:#include#includeusing namespace std;int n,m;char map[1005][1005];int a[1005][1005],l[1005],r[1005];int main(){ int T,i,j,max,t; scanf(... 阅读全文

posted @ 2013-07-28 19:17 后端bug开发工程师 阅读(1665) 评论(0) 推荐(0)

hdu 1506(dp求最大子矩阵)
摘要:题意:容易理解...分析:对于每个单位矩阵,我们先求出连续比它高的最左边的下标假设为l,然后求出比它高的最右边的下标假设为r,然后矩阵的面积就是(r-l+1)*1;我们从左到右扫一遍,求出每个点的l保存在l[]数组里,然后从右到左扫一遍,求出每个点的r保存在r[]数组里,最后可以求出最大的矩阵了。然后做完这个题可以做下这道题的加强版--hdu 1505 我的博客链接:http://www.cnblogs.com/jiangjing/p/3221442.html代码实现:#include#include__int64 a[100005],dp[100005],l[100005],r[100005 阅读全文

posted @ 2013-07-28 19:00 后端bug开发工程师 阅读(3128) 评论(0) 推荐(1)

hdu 1024(最大和连续子序列增强版)
摘要:题意:最大和连续子序列的增强版,要求从一序列中取出若干段,这些段之间不能交叉,使得和最大并输出。分析:用dp[i][j]表示前j个数取出i段得到的最大值,那么状态转移方程为dp[i][j]=max(dp[i][j-1]+a[j],dp[i-1][k]+a[j]) i-1#include#includeusing namespace std;int a[1000001],dp[1000001],max1[1000001];int max(int x,int y){ return x>y?x:y;}int main(){ int i,j,n,m,temp; while(scanf... 阅读全文

posted @ 2013-07-25 17:09 后端bug开发工程师 阅读(2559) 评论(0) 推荐(0)

hdu 2079(01背包+多重背包或者用母函数)
摘要:题意:易理解...分析:01背包+多重背包,主要思考的是如何避免重复,因为是01背包所以我把同种类型的物品一次装入一个背包里,自己好好思考吧!!这道题挺好的!!!当然用母函数也容易理解,母函数更好理解吧!!代码实现:背包实现:#include<stdio.h>//可以说是01背包+多重背包#include<string.h>int main(){ int T,n,m,i,j,k; int a[10],num[10],dp[45]; scanf("%d",&T); while(T--) { scanf("%d%d",& 阅读全文

posted @ 2013-04-09 19:14 后端bug开发工程师 阅读(1311) 评论(1) 推荐(0)

hdu 4512(最长公共递增子序列加强版)
摘要:题意:就是让你求出给定序列的最长的一个左右对称的并且左边递增右边递减的子序列。 思路:可以说是一个最长公共递增子序列的加强版,推荐你看下这个资料:http://www.clarkok.com/blog/?p=353,讲得挺好的,学会这个之后就是如何控制左右对称的问题了 代码实现: 阅读全文

posted @ 2013-03-31 16:15 后端bug开发工程师 阅读(934) 评论(0) 推荐(1)

hdu 1176(一道简单的dp)
摘要:题意:很容易理解...思路:可以说是数塔(hdu 2084)的类似题,做这个题得时候我们可以先画个图,在第0秒的时候在5位置,第一秒的时候可以在4,5,6位置然后依次类推,然后很容易观察出问题的解法了,其实从上往下推和从下往上推都可以,只不过从下往上推要好做一点,这里我给出了两种方法的解题代码。代码实现:#include<stdio.h>//从下往上推的#include<string.h>int a[100005][15],dp[100005][15];int nima(int i,int j){ int x1,x2,x3,temp; x1=j-1;x2=j;x3=j+ 阅读全文

posted @ 2013-03-31 11:05 后端bug开发工程师 阅读(245) 评论(0) 推荐(0)

hdu 1003(最大连续字串)
摘要:题意:很容易理解不用过多的解释。。。分析:因为要求是连续的,所以只要它这左边的大于零就相加,然后以此类推,难点是记录序列的起点和终点,具体看我的代码吧!!代码实现:#include<stdio.h>#include<string.h>int a[100001];int main(){ int T,n,i,j,sum,max,f,r,f1; scanf("%d",&T); for(j=1;j<=T;j++) { scanf("%d",&n); for(i=1;i<=n;i++) scanf("% 阅读全文

posted @ 2013-03-28 11:31 后端bug开发工程师 阅读(317) 评论(0) 推荐(0)

最长公共子序列(求出长度并且输出子序列)
摘要:动态规划思想:把一个大的问题分解成若干个子问题,求出子问题后,然后回溯求出大的问题。分析:给定两个字符串,假设为“a0,a1,a2....an”和"b0,b1,b2...bm",要求出两个字符串的最长公共子序列,我们先把大问题分成小问题,举个例子吧!假设“c0,c1,c2...ck”为它们的最长公共子序列。第一种:an=bm,则“c0,c1,c2...c(k-1)”为“a0,a1,a2...a(n-1)”和"b0,b1,b2...b(m-1)"的最长公共子序列;第二种:an!=bm并且an!=ck则“c0,c1,c2...ck”为"a0,a1, 阅读全文

posted @ 2013-03-23 15:58 后端bug开发工程师 阅读(1980) 评论(0) 推荐(1)

hdu 1559(简单的dp)最大子矩阵
摘要:题意:就是给你一个mXn的矩阵,然后让你在其中找一个和最大的xXy的矩阵。。。思路:我觉得dp就是递推,根据前面的推出后面的,每个矩阵的和我有右下角的点记录:dp[i][j]....代码实现:#include<stdio.h>#include<string.h>int a[1001][1001],dp[1001][1001]={0};int T,m,n,x,y,i,j,max;int nima1(int i){ int sum=0,j; for(j=1;j<=y;j++) sum=sum+a[i][j]-a[i-x][j]; return sum;}int n.. 阅读全文

posted @ 2013-03-17 10:58 后端bug开发工程师 阅读(342) 评论(0) 推荐(0)

导航