dp
acblacktea
永不放弃
展开
-
AHU524 桂园食堂
动归第一题,背包的模板。。。主要是浮点数精度的问题,在浮点数的表示法中,两个数之间的差值是用距离来表示的,因此相差极小的两个数,运算之后可能用同一个数来表示了。那么如何判断两个数相等呢?答案是:差值小于一个足够小的数,比如0.00000001这种。(硕神博客学来的。。。)然后要加0.01.#include<stdio.h> double a[120][10020]; int main() {原创 2015-07-29 18:03:09 · 778 阅读 · 0 评论 -
HDU-1176-免费馅饼
题意没申清 刚开始以为在s点s+1和s-1的馅饼也可以捡和0和10不能到(题意坑也不说清楚)最后发现就是水DP。。。 没做任何优化除了用了个滚动数组。。。#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; int dp[2][13]; int th[100005][1原创 2016-03-18 21:20:00 · 547 阅读 · 0 评论 -
codeforces-Good Bye 2015-New Year and Domino
有点容斥原理的意思。。。#include<cstdio> long long dp[505][505],n,m; char mp[505][505]; int main() { while(scanf("%d%d",&n,&m)!=EOF) { for(int i=1;i<=n;i++) scanf("%s",mp[i]+1); for(in原创 2016-03-19 19:53:44 · 297 阅读 · 0 评论 -
codeforces-Goodbye2015- New Year and Ancient Prophecy
第一次做这种难度的题刚开始做一点思路没有,看完别人的思路做出来以后感觉好简单我居然当时没有思路! 1.先求最长连续子串。因为后面要比较两个字串的大小如果在下面DP的时候在一次次比较两个数的大小妥妥会爆的。 2.DP (1)dp[i][j]代表最末尾为s[i]s[i+1]…s[j]这个数时的方案数,如果末尾为s[i]s[i+1]…s[j]这个数的方案可以,那这些方案同样适用s[i]s[i+1]原创 2016-03-20 15:12:16 · 335 阅读 · 0 评论 -
HDOJ-1428-BFS+记忆化搜索
题意难理解 1.让你先求各点到终点的最短距离 2.求起点到终点的方案数,方案满足途中经过的每个点的到终点的最短距离都要比前面经过的点到终点的最短距离要短。。。#include<cstdio> #include<cstring> #include<queue> using namespace std; #define MAX 9999999 struct node{ int x,y; }n原创 2016-03-20 21:58:55 · 360 阅读 · 0 评论 -
ahu-518-塔
水DP,排个序就不超时了#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; int dp[2][510000],a[60],n; bool sym[2][510000]; int main() { while(scanf("%d",&n)!=EOF) {原创 2016-04-08 15:11:39 · 356 阅读 · 0 评论 -
ahu-730-幸运抽奖
最多情况不超过long long,先DP打表再取模。 dp[52][1300][52] 一维代表此时选择的数的个数,二维代表此时的总和,三维代表此时选的最大数。 dp[i][j][k] = dp[i-1][j-1][1]+dp[i-1][j-2][2]+…dp[i-1][j-k1+1][k1]; 有很多情况不用递推可以剪掉。 思路太繁琐,有没有人用二维DP或组合数学AC的啊!!!#inclu原创 2016-04-09 15:55:53 · 355 阅读 · 0 评论 -
codeforces 675-E Trains and Statistic 线段树+dp
从后往前逆推。 当推到第i个点时候他会倾向于走到他能走到的几个点中的价值最大值的点,因为他要更快的走到最后一个点 所以dp[i] 是由 dp[pre(他能走到的点中的价值最大值的下标)] 推来的,然后要加上n-i因为加上了i这个点就相当于从i+1到n多了一条路径,然而有的是重复的 就是a[i]-pre这个区间从pre到a[i]长度分别为1,而从i到a[i]的长度也分别为1,所以长度并没有变化要减去原创 2016-05-26 02:43:05 · 562 阅读 · 0 评论 -
hdu 5749 Colmerauer
dp46道有类似题 上下左右分别dp一次然后求出以每个点为鞍点的最大上下左右左边界的矩形,然后求里面所有包含这个鞍点的所有子矩形的面积和 求子矩形的面积和公式比较难吧数学太菜#include<cstdio> #include<algorithm> #include<iostream> #define LL long long #define mod (1ll<<32) LL mp[1005][1原创 2016-07-24 22:11:01 · 333 阅读 · 0 评论 -
poj 1417 True Liars 带权并查集+母函数dp
并查集求出每个集合的与祖宗是同一类人的数量和不是同一类人的数量然后只能选其中之一或不选,然后背包并求具体选择方案 按网上题解写的….#include<cstdio> #include<vector> #include<utility> #include<cstring> #define maxn 605 using namespace std; int dp[maxn][maxn],fa[maxn原创 2016-07-20 23:04:59 · 465 阅读 · 0 评论 -
hdoj 5779 Tower Defence ??dp
dp[i][j][k]??? ???i ?????j ?k??????j???? ???k????j?? ??????j-1???? ?k????i??????? ?k????????????? ???????????????? ???????????????? ?????#include<cstdio> #include<cstring> #include<cstdlib> #inc原创 2016-08-01 20:27:16 · 292 阅读 · 0 评论 -
hdoj 5807 Keep In Touch
树形dp会超时 n^6 抽象出三个人是分步到达一点而不是一起到达 dp[i][j][k][0] 代表这个时间段人分别在i,j,k dp[i][j][k][1] 代表现在这个时间只有k先到达,i,j还在上个时间段的位置 dp[i][j][k][2] 代表现在这个时间只有j,k到达,i还在上一位置 所以就形成了当第一个人到达i,第二个人到达j,第三个人到达k时,是k先到达,j后到达,最后i到达原创 2016-08-08 23:12:44 · 296 阅读 · 0 评论 -
HDU-1159-最长公共序列模板。。。
简单但总忘只能记录了。。。#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; char s1[600],s2[600]; int dp[600][600]; int main() { while(scanf("%s %s",s1+1,s2+1)!=EOF)原创 2016-03-17 19:48:03 · 357 阅读 · 0 评论 -
HDOJ 1078 FatMouse and Cheese 记忆化搜索模板
记忆花搜索和普通搜索的区别 前者dp思想从终点推到起点也就是祖宗的最优值从他的子孙中的最优值选取 后者枚举从起点到终点刷新一遍#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[200][200],mp[200][200],n,k,bu[4][2] = {0,1,0,-1,1,0,-原创 2016-03-16 21:09:41 · 752 阅读 · 0 评论 -
hdu2602 Bone Collector
第二发背包模板题(渣渣只能做模板。。。)注意那个骨头重量可以是0。。。。,还有背包优化了很多还是31ms….不知那么多的大神是怎么0ms过的。。。不管了今天就这样了明天再搞。#include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> #include<map> #include<stack> #include<ti原创 2015-07-29 21:25:12 · 314 阅读 · 0 评论 -
通过金矿模型介绍动态规划
http://www.cnblogs.com/sdjl/articles/1274312.html 这篇文章写的不错看他的博客学会了基础dp原创 2015-07-29 20:14:12 · 401 阅读 · 0 评论 -
hdoj2955
以价值总数为背包重量,以银行数量为物品数 ,成功概率为总价值构建背包#include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> #include<map> #include<stack> #include<time.h> #include <memory.h> int mo[1100],sum; double p1原创 2015-07-30 13:07:25 · 423 阅读 · 0 评论 -
hdu-1231最大连续子序列
dp简单递推就行了,不多说了。。。#include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> #include<stack> #include<map> #include<time.h> int a[20000],k,i,j,symbol,max=0,b[20000],i1,max1,star,end,star1,原创 2015-07-30 18:33:39 · 393 阅读 · 0 评论 -
hdu-Max Sum
大神们0ms0kb过的什么鬼,我怎么优化也到不了,晕。。。。#include<stdio.h> int a,i,max,i1,max1,star,end,star1,end1,i2,k; int main() { int t; scanf("%d",&t); i1=1; i2=t; while(t--) { scanf("%d",&k);原创 2015-07-30 19:28:59 · 387 阅读 · 0 评论 -
hdoj1864最大报销额
此题略坑500MS过因为要金钱数组要成*100,可以用贪心0ms过但没有尝试。。。#include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> #include<stack> #include<map> #include<time.h> double money[3000011],sum,sm[50],va,suma原创 2015-07-30 16:44:11 · 376 阅读 · 0 评论 -
ahu727美妙音乐
dp递推出第n个音符以1-m种音符结尾的最大值,然后输出这m个数的最大值,239ms,看前辈大牛14ms过的,不明觉厉。。#include<stdio.h> #include<string.h> #include<cmath> #include<cstdlib> #include<set> #include<queue> using namespace std; int n,m,i,j,k,t,x;原创 2015-09-05 10:06:32 · 802 阅读 · 1 评论 -
ahu-497-最长起伏子序列
最长递增序列的变形dp,我又开始水了。。。。#include<cstdio> #include<cmath> #include<cstring> #include<cstdlib> #include<stack> #include<set> #include<queue> #include<map> #include<iostream> #include<algorithm> using names原创 2015-09-06 22:53:47 · 384 阅读 · 0 评论 -
hdoj2050折线分割平面
捋一下思路, 具体思想是当每加条线与其他已加线都相交时满足平面最多 1,当n条直线相交时的状态比n-1条相交直线多了n-1条多了n-1个交点,增加了n个平面(为什么?画图猜出来的)所以fn = fn-1 +n; 2,当每次加一对平行直线,同理上式double就行了;fn=fn-1 +2*(2*(n-1)+1)此时n为第几对而不是第几条, 3将平行直线一侧相交,就是这种情况了,相交一侧面减1,原创 2015-10-18 23:13:13 · 475 阅读 · 0 评论 -
男人八题coins
DP 不算正式的多重背包但用到了思想,用数组标记能够得到的价值,可以水过去,物品可以用二进制优化加快效率;不断更新就行了。#include<cstdio> #include<cstring> #include<queue> #include<stack> #include<set> #include<cstdlib> using namespace std; int i,j,k,va[200],am原创 2015-10-25 22:56:39 · 443 阅读 · 0 评论 -
Hdoj-1074-状压dp
n个课程就是一个有n位置的二进制数,然后从0(也就是还没写作业)到(1<< n)-1(也就是全写完DP求最优解) 比如说 要完成四门作业的话此时要推dp[1011](第1,2,4门作业完成最少扣得分)那它就是由 dp[1001],dp[0011],dp[1010]三个状态转移的最优解, 置于顺序输出则先由0011转移再由1001转移再由1010转移(物品从n-1到0进行选取也就是先把下表大的作业原创 2016-03-16 15:28:29 · 438 阅读 · 0 评论 -
湖南省赛 有向无环图 水dp
如果两个点之间有多条边,那就相当于一个点连多个相同的点然后dfs跑一下累加和就行了记得记忆化搜索剪枝#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define mod 1000000007ll #define maxn 100005 #define LL long long using names原创 2016-09-05 19:33:24 · 480 阅读 · 0 评论