动态规划(DP),说白了就是递归中间项之间会有互相影响,由于动态规划是从递归得来的,所以动态规划也需要一个递归出口。一般就是要求最优解,比如求最大数字啊,最短路程啊,最XXX啊,一般就是动态规划了
比如经典的斐波那契数列,已知f(1)和f(2),f(n)慢慢推出来
接下来开始
1.
灰色为时间段,红色是对应金钱,求如何得到最多金钱。
方法:选 / 不选
OPT(i)=max( 选:v(i)+OPT(prev(i)) , 不选:OPT(i-1) )
代码不打了,思想就这个思想,最后return 一个max就好了。
2.
从{1,2,4,1,7,8,3 }中选数字,,使得选出的数字结果加起来最大,但不能同时选相邻的数字。(如果是要写到OJ里面,最好还是放到数组里面最递归,不要纯递归不然会复杂度爆炸的)
#include <stdio.h>
#include <stdlib.h>
int max(int a,int b){
if (a>b) return a;
else return b;
}
int rec_opt(int arr[],int i){
int A,B;
if(i==0){
return arr[0];
}
else if (i==1){
return max(arr[0],arr[1]);
}
else{
A= rec_opt(arr,i-2)+arr[i];
B= rec_opt(arr,i-1);
}
return max(A,B);
}
int main(){
int arr[]= {1,2,4,1,7,8,3};
printf("%d",rec_opt(arr,7));
return 0;
}
以上文字均为本人对B站Up主 正月点灯笼的视频做的笔记,仅用于自学笔记用。