动态规划学习

数字三角形问题

把位置(i,j)看成一个状态,然后定义状态(i,j)的指标函数d(i,j):从位置(i,j)出发时能得到的最大和。

递推计算:

int i,j;

//边界值处理

for(j=1;j<=N;j++)

         result[N][j] = data[N][j];

 

//由下向上动态规划,保存叶子节点到当前节点的最大值

for(i=N-1; i>=1;i--)

         for(j = 1; j<=i; j++)

                   result[i][j] =data[i][j]+max(result[i+1][j],result[i+1][j+1])

 

记忆化搜索:

memset(result,-1,sizeof(result))

 

int solve(int i, int j)

{

         //判断result[i][j] >= 0,判断该节点是否已经被计算过

if(result[i][j] >= 0)

         return result[i][j];

 

return result[i][j] = data[i][j] + (i==N?0:max(solve(i+1,j),solve(i+1,j+1)));

} 

动态规划(DP)

硬币问题:

有n种硬币,面值分别为V1, V2, V3,……,Vn,每种面值的硬币有无限个,使得面值之和恰好为S,输出硬币数目的最大值和最小值。——固定终点的最长路和最短路

 

有向无环图为DAG ( Directed Acyclic Graph)

BFS

万能的模板:

 

推荐网址:

http://poj.org/

http://www.cnblogs.com/qiufeihai/archive/2012/09/11/2680840.html

http://www.cnblogs.com/mengwang024/p/4342796.html

 
http://www.cnblogs.com/Anker/archive/2013/03/15/2961725.html

 

posted @ 2015-03-31 18:09  小猴子学代码  阅读(133)  评论(0编辑  收藏  举报