问题:

  假设我们有一个n*n的矩阵,w[n][n],矩阵存储的都是正整数,棋子的起始位置在左上角,终止位置在右下角,我们将棋子从左上角移动到右下角,每次只能向右或者向下移动一位。从左上角到右下角,会有很多不同的路径可以走,我们把每条路径经过的数字加起来看做路径的长度。那从左上角移动到右下角的最短路径长度是多少呢?

分析:

  每一阶段有两种选择,可以选择向右或者向下。是一个多阶段决策最优化问题。满足最优子结构、无后效性、重复子问题这三个特征。是一个典型的动态规划问题。

代码:

 

 1 #include <iostream>
 2 
 3 int main()
 4 {
 5     int value[4][4] = {
 6         1, 3, 5, 9,
 7         2, 1, 3, 4,
 8         5, 2, 6, 7,
 9         6, 8, 4, 3
10     };
11     
12     int states[4][4] = {0};
13     
14     states[0][0] = 1;
15     for(int i = 1; i < 4; i++)   // 初始化第一行
16         states[0][i] = states[0][i - 1] + value[0][i];
17     
18     for(int j = 1; j < 4; j++)   // 初始化第一列
19         states[j][0] = states[j - 1][0] + value[j][0];
20     
21     for(int i = 1; i < 4; i++)
22     {
23         for(int j = 1; j < 4; j++)
24         {
25             states[i][j] = std::min(states[i - 1][j], states[i][j - 1]) + value[i][j];
26         }
27     }
28     
29     std::cout << "min : " << states[3][3] << std::endl;
30     
31     return 0;
32 }

运行结果:

 

 

 

posted on 2020-08-13 09:14  周伯通789  阅读(754)  评论(0编辑  收藏  举报