随笔分类 -  dp

摘要:因为一开始给出的是中序遍历 所以这其实是一道区间dp。。。 dp的同时记一下每个点的儿子就可以完成第二问 #include<iostream> #include<cstdio> using namespace std; int a[32],n,f[32][32],crf[32][32]; long 阅读全文
posted @ 2017-10-20 17:39 探险家Mr.H 阅读(113) 评论(0) 推荐(0)
摘要:dp[i]表示1~i最大效率 记一下前缀和 转移就是f[i]=max(f[i],f[j-1]-sum[j])+sum[i] (i-k<=j<=i) 发现括号里的只与j有关 开一个单调队列维护一下 阅读全文
posted @ 2017-10-20 17:37 探险家Mr.H 阅读(157) 评论(0) 推荐(0)
摘要:背包问题加强版orz #include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; long long a[500][500],f[500],n,m,a1[500],b1[500] 阅读全文
posted @ 2017-10-20 17:30 探险家Mr.H 阅读(158) 评论(0) 推荐(0)
摘要:dp[i][j]表示走i分钟疲劳值为j时的最远距离 然后搞一下就好啦 #include <iostream> #include <cstdio> #include <algorithm> #include <cstdlib> #include <cstring> #include <cmath> # 阅读全文
posted @ 2017-10-20 17:29 探险家Mr.H 阅读(143) 评论(0) 推荐(0)
摘要:#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int MAXN=10010; 阅读全文
posted @ 2017-10-12 19:56 探险家Mr.H 阅读(175) 评论(0) 推荐(0)
摘要:区间dp 一般格式为“枚举中间点” 即dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+fuckuniverse); 比较经典的问题就是合并石子 设有N堆沙子排成一排,其编号为1,2,3,…,N(N<=300)。每堆沙子有一定的数量,可以用一个整数来描述,现在要将这 阅读全文
posted @ 2017-09-19 17:33 探险家Mr.H 阅读(233) 评论(0) 推荐(0)
摘要:大学招n(n为奇数)个牛 招第i个牛需要ai块钱 第i个牛高考si分 输入招的牛数n 总的牛数c 总的钱数f 以及ai si 问用这些钱招的n个牛高考分数的中位数最大是多少 如果钱不够输出-1 这题结果只与中间那个牛的分数有关 设k=(n+1)/2 则可以得到分比k低的招了(n-1)/2个 比k高的 阅读全文
posted @ 2017-07-15 13:15 探险家Mr.H 阅读(287) 评论(0) 推荐(0)
摘要:题目的意思就是给n个数,n个两两数之间的运算符(只有+和*)问首先去掉哪个运算符号之后可以让其他的数按照一定的方法计算后结果最大。 其实结题思路还是比较好想到的,枚举(枚举去掉的符号)+DP(记忆化搜索)就可以做到。但这里有一个天坑,就是负负得正,所以不能单一的枚举最大值,而要同时DP最小值。 计算 阅读全文
posted @ 2017-07-03 16:10 探险家Mr.H 阅读(238) 评论(0) 推荐(0)
摘要:题目大意:一个船要把n个车渡过河 船最多载m辆车 把车运过去需要t的时间 回来也要t的时间 给定n辆车依次到河边的时间 求最短运送时间 还有最短跑几趟 一维dp 可以直接d运送时间 dp[i]=min{max(time[i],dp[j]+t)+t} (i-n=<j<i) time[i]表示第i辆车到 阅读全文
posted @ 2017-07-03 16:04 探险家Mr.H 阅读(202) 评论(0) 推荐(0)