数字三角形问题
把位置(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://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