始终认为动静布局是一种具体算法。其实动静布局是一种思维。
“记住求过的解来节省时间”。
一个典型的例子是斐波那契数列,
int fib(int n){ if (n <= 1) { return 1; } else return fib(n-1) + fib(n-2);}
其中的递归会将雷同的数字计算屡次,造成程序的低效。
改良int fibonacci(int n){ int i=0, last =0, next_to_last =0, answer =0; if(n<=1) return 1; last = next_to_last =1; for (i=2; i<=n; i++) { answer = last+next_to_last; next_to_last = last; last = answer; } return answer;}
另外一个是LeetCode 198题,打家劫舍
#define max(a,b) ((a>b)?(a):(b))int rob(int* nums, int numsSize){ //dp[i] = max(dp[i-2]+k,dp[i-1]); int ret =0; if(numsSize ==0) return 0; if(numsSize ==1) return nums[0]; if(numsSize ==2) return max(nums[0],nums[1]); int i=0; int * dp = ( int* )malloc( sizeof(int) * (numsSize+1)); dp[0] = nums[0]; dp[1] = max(nums[0],nums[1]); for (i=2; i<numsSize; i++) { if(dp[i-2]+nums[i] >= dp[i-1]) { dp[i] = dp[i-2] + nums[i]; } else { dp[i] = dp[i-1]; } } ret = dp[numsSize-1]; free(dp); return ret;}
应用一个数组来保留两头数据,最初失去答案。