动态规划
文章平均质量分 71
LiWen_7
这个作者很懒,什么都没留下…
展开
-
01背包(转)
例题1、 基本的0-1背包问题(HDU 2602) 这是最基本的01背包模型。定义f[i][j]:在前i个bone中用容量为j的包选择bone所能得到的最大价值。设:第i个bone的volume为c[i],相应的value为w[i]。分析:将“前i个bone装进容量为j的包中所得到的最大价值”这个子问题的求解,考虑第i个bone,则会有两种策略:、不选择第i个bone转载 2012-03-23 17:25:18 · 602 阅读 · 0 评论 -
滚动数组
昨晚做了一道题,开了一个int [5000][5000]的数组,OLE了,虽然可以用short [5000][5000]猥琐过,但毕竟只是特殊情况 正确的方法是滚动数组压缩存储,整理了一下网上的资料: 利用滚动数组的话在N很大的情况下可以达到压缩存储的作用。不过经常还是用在DP题目中,因为DP题目是一个自下而上的扩展过程,我们常常用到是连续的解,前面的解往往舍弃!所转载 2012-11-03 13:18:23 · 745 阅读 · 0 评论 -
BUY LOW, BUT LOWER
“逢低吸纳”是炒股的一条成功秘诀。如果你想成为一个成功的投资者,就要遵守这条秘诀:"逢低吸纳,越低越买"这句话的意思是:每次你购买股票时的股价一定要比你上次购买时的股价低.按照这个规则购买股票的次数越多越好,看看你最多能按这个规则买几次。给定连续的N天中每天的股价。你可以在任何一天购买一次股票,但是购买时的股价一定要比你上次购买时的股价低。写一个程序,求出最多能买几次股票。原创 2012-08-05 15:26:04 · 558 阅读 · 0 评论 -
最长公共子序列 HDU 1159/1080/1503
hdu 1159 题意:求两个串的最长公共子序列#include#include#include#define size 1000using namespace std;char str1[size],str2[size];int dp[size][size];int main(){ int len1,len2; while(scanf("%s",str1)原创 2012-10-30 21:00:37 · 807 阅读 · 0 评论 -
hdu 3576 Elevators in Jiayuan Students' Apartment(DP)
tup[ f ][ i ] [ j ] [ k ]表示 第f层第一个电梯i个人,第二个电梯j个人,第三个电梯k个人的情况下要停几次。#include#include#define INF 0x7fffffffusing namespace std;int hash[20];int tup[20][20][20][20];int v , n;int dp(){ tup[原创 2012-09-14 09:40:33 · 925 阅读 · 0 评论 -
coj 1504 放置棋子(诸侯安置)dp
很久以前,有一个强大的帝国,它的国土成正方形状,如图2—2所示。 这个国家有若干诸侯。由于这些诸侯都曾立下赫赫战功,国王准备给他们每人一块封地(正方形中的一格)。但是,这些诸侯又非常好战,当两个诸侯位于同一行或同一列时,他们就会开战。如下图2—3为n=3时的国土,阴影部分表示诸侯所处的位置。前两幅图中的诸侯可以互相攻击,第三幅则不可以。 国王自然不愿意看到他的诸侯们原创 2012-08-16 10:20:54 · 2085 阅读 · 0 评论 -
06 分组背包 hdu 1712 3033
内容见: 背包九讲相关题目:hdu 1712 3033 3535(各种分组背包)hdu 1712代码:#include#includeusing namespace std;int f[110];int w[110][110];int n,m;void GroupPack(){ for(int i=1;i<=n;i++) {原创 2012-07-25 18:49:57 · 806 阅读 · 0 评论 -
hdu 3535 各类分组背包
当某组的性质为0时是分组背包变形,每次状态从前一组获当前组转移而来,能从一个地方转移而来,这组就合法。 当某组的性质为1时,就是分组背包,但这里是用二维数组,在一组计算完成之后,要把前一组的结果复制下来。 当某组的性质为2时,就把这组当成01背包来做,也要记得把前一组的结果复制下来,因为本组可以不选。 本题有个trick,那就是容量是从0开原创 2012-07-26 12:31:24 · 1129 阅读 · 0 评论 -
hdu 3496 二维费用背包
题意:求在一定l时间内看完n中电影中的m是否可能,若可能则最后快乐度是多少。之前错了好多遍,一直找不到原因,后来在百度上看了很多别人的代码发现只有初始化不同我的初始化: memset(f,0,sizeof(f));别人的: for(int i=0;i for(int j=0;j一开始认为没什么影响,但是苦于一直找不到原因,所以我将自原创 2012-07-24 21:45:25 · 1087 阅读 · 0 评论 -
03多重背包问题
具体内容见背包九讲(3)相关题目:hdu 1171 2844 1059/poj1014 2191 (没做:poj 2392 poj1276)hdu 2844大意:有不同价值的硬币,每种价值硬币有一定数量个。求用这些硬币可以组成的钱的种数是多少。则判断条件不在是 :if( f[i] 代码://是求可能组成<m的钱数的可能数 #include原创 2012-07-24 16:53:43 · 740 阅读 · 0 评论 -
hdu 2191 单调队列优化
F[i][j] = max { F[i - 1] [j – k * v[i] ] + k * w[i] } (0 假设 v[i]为容量 w[i]为价值 no[i]为数量a = j / v[i] 即a为i种物品最大可能使用次数。 b = j % v[i] 即不能用i种物品表达的价值。则朴素转移公式可化为: F[i][j] = max { F[a*v[i] + b - k*v[原创 2012-07-24 17:05:20 · 820 阅读 · 0 评论 -
02 完全背包
具体内容见背包九讲。相关题目:HDU2159 hdu1114/poj1384(简单变形) hdu1248(水) hdu2189 POJ2063hdu1248直接运用01背包模板修改得://注意:若n<150,则全部当小费 #include#includeusing namespace std;int f[10010],n;void ZeroTwoPack(int原创 2012-07-23 11:21:33 · 473 阅读 · 0 评论 -
hdu 1007 分治
题意:求最近点对暴力一定超时,分治:(代码参考别人)求最大的环,此环只能套中一个,所以只能先找出距离最小的两点且其距离就是环的直径,不然该环就有可能一次套中两个环。所以这题的题意是:求最近点对。#include#include#include#include#include#define DX(x) ((x)*(x))using namespace std;原创 2012-04-04 19:57:52 · 1103 阅读 · 0 评论 -
1003
简单的DP:now 表示当前的值,顺序输入temp 若now+temp(代码参考的别人的……)#includeusing namespace std;int main(){ int t,n; scanf("%d",&t); int now,temp,pos1,pos2,x,max; int num=0; wh原创 2012-03-29 20:37:19 · 545 阅读 · 0 评论 -
NK1137 石子合并
在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。编程任务:对于给定n堆石子,编程计算合并成一堆的最小得分和最大得分。Input输入包括多组测试数据,每组测试数据包括两行。第1 行是正整数n,1原创 2012-11-08 21:57:47 · 1588 阅读 · 1 评论