动态规划,可以看这个http://www.360doc.com/content/13/0601/00/8076359_289597587.shtml
我理解的,就是如果一个方法用递归,你发现过程会有重复,比如斐波那契数列,a(n)=a(n-1)+a(n-2),然后就会出现每个被算n次的悲剧(3=1+2,5=2+3,8=3+5,算5的时候3被递归了,算8的时候,3被递归了,5又递归了3,这样往后算不得了.....),所以采取一种查表的方式,就是做一个状态空间的表,把这个过程平铺开。
动态规划的解法呢,就是要找出来状态空间和空间之间如何转移,比如斐波那契,a(n)就是每个解,递推关系就是转移,但是和递归的区别,就是我在求a(n)的时候,前两个是已知的,之前被算出来的,a(n)和a(n-1)是分离开的不具有联系
可能这么说理论还是没什么用,还是要多做例子。。。目前做的都是leetcode的easy,就放一个House Robber.....这里的状态tail[i],是包含第i个数的最大策略。
class Solution {
public:
int rob(vector<int>& nums) {
vector<int> tail(nums.size()+1);
int maxRe=0;
for(int i=0;i<nums.size()+1;i++)
{
switch(i){
case 0:tail[i]=0;break;
case 1:tail[i]=nums[0];break;
case 2:tail[i]=nums[1];break;
default:tail[i]=nums[i-1]+max(tail[i-2],tail[i-3]);
}
maxRe=max(maxRe,tail[i]);
}
return maxRe;
}
};
股票的问题,我选的状态空间d(i),就是以第i个数为结尾的前面所有数列最小值:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int profit=0;
int StockMin=INT_MAX;
for(int i=0;i<prices.size();i++)
{
StockMin=min(StockMin,prices[i]);
profit=max(profit,prices[i]-StockMin);
}
return profit;
}
};