DP
文章平均质量分 60
South__wind
ACMER
展开
-
poj 1088 滑雪
dp+记忆化搜索,dp[i][j]表示以i,j这个位置为起点能够划过的最大高度。#include#includeint dir_x[4]={1,-1,0,0};int dir_y[4]={0,0,1,-1};int map[110][110],dp[110][110];int m,n,ans;int max(int a,int b){ if(a>原创 2012-08-29 15:31:34 · 219 阅读 · 0 评论 -
poj 1946 Cow Cycling
题意:有N头奶牛,要跑D圈,每头奶牛的初始能量为E,每头牛每分钟可以跑任意圈,除领跑的奶牛外,每跑x圈,消耗能量为x,领跑的奶牛消耗的能量为x*x,能量消耗尽的奶牛随时退场,问至少有一头奶牛能去到终点所用的最短时间。dp[i][j][k]表示当前第i头牛领跑,已跑了j圈,用了k的体力花的时间。那么可以写出状态转移方程dp[i][j+l][k+l*l] = min(dp[i][j+l][k+原创 2012-09-19 20:44:34 · 393 阅读 · 0 评论 -
hdu 3576 Elevators in Jiayuan Students' Apartment
题意:一幢楼有16层,共有3个电梯,现在又m个人要去不同的楼层(一楼除外,因为你一开始就在一楼嘛),问你怎样安排这些人去不同的电梯,使得这些人都到达指定的楼层的情况下电梯停的次数最少。以前在杭电做过这个题,今天在ccsu的oj上的比赛又碰到了,幸运啊。dp:背包的变形,开一个四维的数组,第一维表示当前所在的楼层,第二维表示第一个电梯在该楼层的人数,第三维表示第二个电梯在该楼层的原创 2012-09-06 20:31:21 · 840 阅读 · 0 评论 -
poj 1384 Piggy-Bank
背包的变形题目,告诉你所有硬币加起来的总重量以及每种硬币的重量和价值,要求估算一定重量的硬币的最小价值。#includeint dp[10001];int pp[501];int ww[501];int t,e,f,n,p,w,v;int main(){ scanf("%d",&t); while(t--) { scanf("%d原创 2012-08-27 20:47:48 · 299 阅读 · 0 评论 -
poj 1952 BUY LOW, BUY LOWER
dp:求一串序列中最长递减子序列包含的数的个数以及有几个长度相同的最长的递减子序列,并不要求连续。#include #include #include using namespace std;const int size = 5100;int maxlen[size];int maxnum[size];int main(){ int a[siz原创 2012-09-02 21:53:46 · 319 阅读 · 0 评论 -
hdu 2602 Bone Collector
最普通不过de背包:#include#includeusing namespace std;int num[20000];int dp[2][20000];int a[20][20];int n;void dfs(int deep,int tot){ for ( int i = deep ; i < n ; i ++ ) {原创 2012-09-01 20:58:28 · 312 阅读 · 0 评论 -
hdu 1565 方格取数(1)
#include#includeusing namespace std;int num[20000];int dp[2][20000];int a[20][20];int n;void dfs(int deep,int tot){ for ( int i = deep ; i < n ; i ++ ) { num[0]++原创 2012-09-01 20:55:24 · 462 阅读 · 0 评论 -
hdu 1078 FatMouse and Cheese
DP+记忆化搜索 dp[i][j]表示以map[i][j]为起点路径搜索得到的的和的最大值。所以最后的结果自然为dp[0][0]了。#includeusing namespace std;int map[100][100],dp[100][100];int dirx[4]={1,-1,0,0};int diry[4]={0,0,-1,1};int n,k;i原创 2012-08-31 01:32:34 · 270 阅读 · 0 评论 -
hdu 1069 Monkey and Banana
dp+记忆化搜索主要是将一个砖块的不同摆放方式,转化为6种不同的砖块,按同一方式摆放,这就将一个3维问题转化成为了一个1维问题。同一底面的砖块只构造了一次,DFS时直放横放都判断一次就可以了。dp[i]表示以i砖块作为第一块底砖能够达到的最大高度,所以结果自然为DP[0];#include#include#define max(a,b)((a)>(b)?(a):(b))原创 2012-08-31 01:29:30 · 460 阅读 · 0 评论 -
hdu 1087 Super Jumping! Jumping! Jumping!
dp。#includeusing namespace std;int dp[1010],a[1010];int vis[1010];int n;int main(){ while(cin>>n) { if(n==0) break; for(int i=1;i<=n;i++) {原创 2012-08-31 01:41:14 · 264 阅读 · 0 评论 -
hdu 1081 To The Max
把一维的最大连续子段和扩展到二维的时候也是同样的方法,不过需要将二维压缩成一维,所以我们要将数据做一下处理,使得a[i][j]从表示第i行第j个元素变成表示第i行前j个元素和,这样a[k][j]-a[k][i]就可以表示第k行从i->j列的元素和。只要比一维多两层循环枚举i和j就行了。#includeusing namespace std;int main(){ in原创 2012-08-31 01:39:22 · 259 阅读 · 0 评论 -
poj 1948 Triangular Pastures
一个很经典的背包变形,已知三角形的周长,和组成三角形的所有木棍的长度,要求用所有的木棍围成的三角形的面积最大。三角形只要确定两条边就够了,因为周长是知道的。# include# include# includeusing namespace std;int f[50];float g[800][800],ans,a,b,tt;int main(){ int原创 2012-08-27 20:27:24 · 385 阅读 · 0 评论 -
poj 1185 炮兵阵地
一道很经典的状态压缩DP,首先DFS出所有的可能状态,M<=10 ,总状态最大为60.dp[i][j][k] 表示前i行,第i-1行状态为num[j], 第i行状态为num[k]的最优解。然后枚举3行的状态,时间复杂度为100*60^3,进行状态转移即可。注意有些格子不能放炮兵,所以用一个mach数组记录每一行的状态 进行&运算结果为0说明不能放的格子上面没有放炮兵然后每次的最优解原创 2012-08-30 15:30:21 · 271 阅读 · 0 评论 -
hdu 1058 Humble Numbers
#includelong long hum[5843];int prime[4]={2,3,5,7};int N;using namespace std;int main(){ hum[1]=1; hum[0]=1; int i,j,k; for(i=2;i<=5842;i++) { hum[i]=3000000000;原创 2012-08-31 01:26:44 · 324 阅读 · 0 评论 -
hdu 1003 Max Sum
最大连续子段和:#includeusing namespace std;int a[100000];int start,end;int main(){ int n,m; while(cin>>n) { for(int i=0;i<n;i++) { cin>>m; for(int j=1;j<=原创 2012-08-30 16:35:56 · 251 阅读 · 0 评论 -
poj 1949 Chores
题意是有N行任务,给出完成每项任务所需要的时间长度,求出完成所有任务所需要的最短时间.每个任务都会有一个约束条件,就是在完成这项任务之前必须完成所列出的其它任务.可以同时做多项任务.简单来说就像煮饭炒菜问题一样,可以一边烧饭一边炒菜.但炒菜之前必先洗菜.不要想太复杂了,杂活i所需要的时间是本身的时间加上完成前提杂活的最晚时间。完成杂活的总时间就是各个杂活完成的最大时间。#inclu原创 2012-09-19 17:15:24 · 414 阅读 · 0 评论