《C算法》——递归和动态规划
2006-09-28 16:28
232 查看
递归
动态规划可以非常容易的将一个指数时间的递归问题转化为线性时间。下面是两个简单的例子。
----------------------------------------------------------------------------------------------------
斐波纳契数(递归实现)不可行
int F(int i)
...{
if(i < 1) return 0;
if(i == 1) return 1;
return F(i-1) + F(i-2);
}
-----------------------------------------------------------------------------------------------------
斐波纳契数(动态规划)
int F(int i)
...{
int t;
if(knownF[i] != unknown) return knownF[i];
if(i == 0) t = 0;
if(i == 1) t = 1;
if(i > 1) t = F(i-1) + F(i-2);
return (knownF[i] = t);
}
-----------------------------------------------------------------------------------------------------
背包问题(递归实现)不可行
typedef struct
...{
int size;
int val;
} Item;
Item items
;
int knap(int cap)
...{
int i, space, max, t;
for(i = 0, max = 0; i < N; i++)
...{
if((space = cap - items[i].size) >= 0)
if((t = knap(space) + items[i].val) > max)
max = t;
}
return max;
}
-----------------------------------------------------------------------------------------------------
背包问题(动态规划)
int knap(int cap)
...{
int i, space, max, maxi, t;
if(maxKnown[cap] != unknown) return maxKnown[cap];
for(i = 0, max = 0; i < N; i++)
...{
if((space = cap - items[i].size) >= 0)
...{
if((t = knap(space) + items[i].val) > max)
...{
max = t;
maxi = i;
}
}
}
maxKnown[cap] = max;
return max;
}
动态规划可以非常容易的将一个指数时间的递归问题转化为线性时间。下面是两个简单的例子。
----------------------------------------------------------------------------------------------------
斐波纳契数(递归实现)不可行
int F(int i)
...{
if(i < 1) return 0;
if(i == 1) return 1;
return F(i-1) + F(i-2);
}
-----------------------------------------------------------------------------------------------------
斐波纳契数(动态规划)
int F(int i)
...{
int t;
if(knownF[i] != unknown) return knownF[i];
if(i == 0) t = 0;
if(i == 1) t = 1;
if(i > 1) t = F(i-1) + F(i-2);
return (knownF[i] = t);
}
-----------------------------------------------------------------------------------------------------
背包问题(递归实现)不可行
typedef struct
...{
int size;
int val;
} Item;
Item items
;
int knap(int cap)
...{
int i, space, max, t;
for(i = 0, max = 0; i < N; i++)
...{
if((space = cap - items[i].size) >= 0)
if((t = knap(space) + items[i].val) > max)
max = t;
}
return max;
}
-----------------------------------------------------------------------------------------------------
背包问题(动态规划)
int knap(int cap)
...{
int i, space, max, maxi, t;
if(maxKnown[cap] != unknown) return maxKnown[cap];
for(i = 0, max = 0; i < N; i++)
...{
if((space = cap - items[i].size) >= 0)
...{
if((t = knap(space) + items[i].val) > max)
...{
max = t;
maxi = i;
}
}
}
maxKnown[cap] = max;
return max;
}
相关文章推荐
- 《C算法》——递归和动态规划[转贴]
- 《Cracking the Coding Interview》——第9章:递归和动态规划——题目2
- 《Cracking the Coding Interview》——第9章:递归和动态规划——题目10
- 整数划分 用递归,动态规划,母函数法实现
- 暴力递归 转 动态规划
- 未名湖边的烦恼 动态规划+递归解法说明
- Edit distance problem 动态规划和递归解法之比较
- [链接]递归、递推、动态规划学习链接
- noj1017_乘积最大,递归与动态规划
- 递归和动态规划
- 3.8——求二叉树中结点的最大距离(树,递归,动态规划)
- 241题——Different Ways to Add Parentheses (递归,动态规划,分治法)
- 9.9递归和动态规划(十一)——算出有几种括号的放法可使该表达式得出result值
- 递归、分治策略、动态规划以及贪心算法之间的关系
- 程序员面试金典: 9.9 递归和动态规划 9.1上楼的方式
- 细谈递归,备忘录递归,动态规划,三种算法思想和运行原理
- 算法总结(11)--伪递归,dfs,动态规划题,需要转换下思路
- 动态规划、递归:word-break II
- 暴力递归转动态规划详解
- 从递归到动态规划的代码转换之道