随笔分类 -  DP

OJ上动态规划的题目,dp学习笔记
摘要:View Code 1 #include <cstdio> 2 3 #include <cstdlib> 4 5 #include <cstring> 6 7 8 9 #define MAXN (100000 + 100) 10 11 #define I64 __int64 12 13 14 15 int a[MAXN], f[MAXN]; 16 17 I64 head, tail; 18 19 I64 nowh, nowt; 20 21 I64 res; 22 23 24 25 void Clear() { 26 27 memset(a, 0, sizeo 阅读全文
posted @ 2011-07-20 16:30 cloehui 阅读(159) 评论(0) 推荐(0)
摘要:题目:http://acm.hdu.edu.cn/showproblem.php?pid=3853题目大意:二维地图,分成r*c的方格,从左上角走到右下角,在每个格内有一定的概率停在原地,右移一格,下移一格,三种情况概率和为1。每次移动(包括停在原地)耗费两点魔法值。求从起点到终点所耗魔法值的期望。算法:dp思路:期望公式 E = x1 * p1 + x2 *p2 + …… +xn * pn 假设每格内停在原地概率为map[i][j].x,右移一格概率为map[i][j].y,下移一格概率为map[i][j].z;exp[i][j] 为从起点走到ij格所耗魔法值的期望。 同时可以得知exp[r 阅读全文
posted @ 2011-07-20 15:58 cloehui 阅读(246) 评论(0) 推荐(0)
摘要:题目:http://poj.org/problem?id=1163动态规划入门题~~ 在很长一段时间内,我的dp水平都停留在只会写数塔……选择一条路径从底加到顶,对每一个点num[i][j]来说,都可以从num[i+1][j] 和 num[i+1][j+1]中选一个加上来。如果每一次都加其中大的,并更新当前值,那么一直加到顶部,那个数必然是最大的。我的理解就是,每步都取最优解,所以最后的解也是最优的。AC code: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #define MAX 100 + 10 4 int main 阅读全文
posted @ 2011-07-20 11:03 cloehui 阅读(288) 评论(0) 推荐(0)
摘要:题目:http://poj.org/problem?id=1088据说是一道很经典的dp入门题我的做法是用一个二维数组储存原始数据,然后对每个点调用一个递归函数,寻找周围四个方向的最长路径,加1作为这个点的最长路径。递归的方法是,对周围的四个点,如果点在地图内且高度下降,再找这个点的四个方向上的点,于是当达到边界或是某点已经被计算过,递归结束,返回最长路径值。所以这里还用到了记忆化搜索,对于每个点,都要记录这个点的最长路径值,这样就避免重复计算,是一种用空间换时间的做法。 对地图中的每个点都要调用子函数递归计算该点可以达到的路径最大值。然后比较出一个最大的作为该地图的最长路径。 要注意地图边界 阅读全文
posted @ 2011-07-20 10:51 cloehui 阅读(864) 评论(0) 推荐(0)