动态规划的一点小心得和例题(萌新)

基本概念

         动态规划,英文名Dynamic Programming,简称DP,是一种用于求解具有某种最优性质问题的算法。
         动态规划过程中:依赖当前的状态,又会影响之后的状态的转移,一个决策序列就是在变化的状态
         中产生出来的,这种解决多阶段决策最优化的过程叫做动态规划。

思想

动态规划的基本思想就是把一个大问题分解成多个子问题,然后再把子问题逐步计算解决,但是过程中特别的是要每次把子问题都解决之后的保存下来,在需要使用的时候直接再调用出来,这样可以避免多次的重复计算,大量节省时间。不管子问题是否被使用,都把它记下了,这就是动态规划的基本思路。

例题

emm,用例题来理解一下吧。
题目1 有n级台阶,一个人每次上一级或者两级,问有多少种走完n级台阶方法?
原题
n:1 2 3 4 5 6 7 8 9 10
走法:1 2 3 5 8 13 21 34 55 89
由上面可以分析出:除1级和2级之外,走n级台阶,每次只能走一步或者两步,所以走n级的方法
种数是依赖于走n-1级的和n-2级的方法种数,我们就可以得出dp[n]=dp[n-1]+dp[n-2]的式子。
c++代码:

#include <iostream>
#define maxn 45
using namespace std;
int a[maxn];//定义一个数组保存子结果; 
int dp(int x){
 if(x==1||x==2) return x;//n为1和2时要单独计算 
 if(x>=3){//之后的都采用递归 
  a[x]=dp(x-1)+dp(x-2);//把每个数据保存下来 
  return a[x];
 }
}
int main()
{
 int n;
 cin>>n;
 cout<<dp(n)<<endl; 
 return 0;
 } 

猜你喜欢

转载自blog.csdn.net/xiaolue321/article/details/107590272