动态规划按照我的理解就是避免重复计算,牺牲空间换时间,将重复计算的结果保存起来,下次用的时候,直接使用保存的结果,我文字不多,直接上代码,没有编程基础的兄弟们可能不太能看懂
两种方式一种是递归,另一种是递推(其实就是采用for循环)
/*
*动态规划-切割钢条
*米(m) :1 2 3 4 5 6 7 8 9 10
*价格(p):1 5 8 9 10 17 17 20 24 30
*/
#include<stdio.h>
#include<stdlib.h>
int p[11];
int *r = NULL; /*记录钢条米长的最佳结果,避免重复计算*/
int max(int a , int b){
return a > b ? a : b;
}
/*
*切割钢条函数入口,对一些参数进行初始化
*@length 钢条长度
*/
int CuttingSteelBarEntrance(int length){
p[1] = 1;
p[2] = 5;
p[3] = 8;
p[4] = 9;
p[5] = 10;
p[6] = 17;
p[7] = 17;
p[8] = 20;
p[9] = 24;
p[10] = 30;
r = (int *)malloc((length + 1) *sizeof(int)); /*分配长度*/
for(int i = 1 ; i <= length ;i++){
r[i] = -1;
}
return CuttingSteelBarRunning2(length);
}
/*
*length : 钢条长度,不超过10米
*递归:自顶向下
*/
int CuttingSteelBarRunning1(int length){
if(length <= 0){
return 0;
}else if(r[length] != -1){
return r[length]; /*直接返回length长钢条的最佳利益*/
}
int q = -1;
for(int i = 1 ; i <= length ; i++){
q = max(q , p[i] + CuttingSteelBarRunning1(length - i));
}
r[length] = q; /*记录length米钢条的最佳利益*/
return q;
}
/*
*length : 钢条长度,不超过10米
*递推:自底向上
*/
int CuttingSteelBarRunning2(int length){
int q = -1;
r[0] = 0;
r[1] = p[1];
for(int i = 1 ; i <= length ; i++){
for(int j = 1 ; j <= i ; j++){
q = max(q , p[j] + r[i - j]);
}
r[i] = q;
}
return q;
}
算法不完美,希望各位指点,随便吐槽