问题:
假设我们有一个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 }
运行结果: