#include <iostream>
#include<algorithm>
using namespace std;
int path[201][201];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
path[i][j]=999999;
}
}
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
cin>>path[i][j];
}
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=0;j<=n;j++){
if(path[i][j]>path[i][k]+path[k][j]){
path[i][j]=path[i][k]+path[k][j];
}
}
}
}
cout<<path[1][n]<<endl;
}
算法步骤
1.初始化路径数组:首先将所有点对之间
的路径长度初始化为一个足够大的数(999999,用于表示无穷大)。
2.读入直接路径:根据输入,更新已知的路径长度。
3.动态规划更新:使用三重循环,依次考虑是否通过中间点k可以缩短从点i 到点j 的路径长度。具体步骤是:
·对于每一个中间点k,遍历所有的点对(i,j)。
·如果当前已知的从 i到j的路径长度大于从 i经过k再到j的路径长度之和,则更新路径长度为更小的值。
4.最终输出结果:最终,path[1][n]就是从点1到点n的最短路径长度。