动态规划是一种将问题通过状态和状态转移的定义来拆分问题,每个状态都求出最优解并存储起来,通过状态转移来求下一个状态的最优解。
这是一个问题:一个人一次能上一个或两个台阶,有n个台阶,总共有多少种上法
static void Main(string[] args) { Console.WriteLine(GetNum(4)); Console.ReadKey(); } static int GetNum(int all) { if (all == 0) { return 0; } //边界 if (all == 1) { return 1;//台阶只有一个时,只有一种走法 } if (all == 2) { return 2;//台阶有两个时有两种走法 } //计算最后两个状态 int Fi = 1; int Fj = 2; int temp = 0; for (int i = 2; i < all; i++) { temp = Fj; Fj = Fi + Fj;//状态转移方法 Fi = temp; } return Fj; }
这里的状态就是 F(n),就是表示n个台阶一共有几种上法
问题的拆分就是F(n)拆分成F(1),F(2)...F(n)
状态的转移就是:F(n) = F(n-1) + F(n-2)