'commit'
This commit is contained in:
52
TangDou/XiTi/1279.cpp
Normal file
52
TangDou/XiTi/1279.cpp
Normal file
@@ -0,0 +1,52 @@
|
||||
#include <bits/stdc++.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int n;
|
||||
int a[101][101] = {0};
|
||||
int f[101];
|
||||
|
||||
int main() {
|
||||
//输入+输出重定向
|
||||
freopen("../1279.txt", "r", stdin);
|
||||
cin >> n;
|
||||
for (int i = 1; i <= n; i++) {
|
||||
for (int j = 1; j <= n; j++) {
|
||||
cin >> a[i][j];
|
||||
}
|
||||
}
|
||||
//问:从编号为 1 的城市到编号为n 的城市之间的最短距离是多少?
|
||||
//思路:从最后一个城市,反向构建,
|
||||
for (int i = 1; i <= n; i++) {
|
||||
f[i] = a[n][i] > 0 ? a[n][i] : 9999; //复制最后一行,做为动态规划的起始数据
|
||||
}
|
||||
for (int i = 1; i <= n; i++) {
|
||||
cout << f[i] << " ";
|
||||
}
|
||||
cout << endl;
|
||||
|
||||
//动态规划的DP表定义:一维数组
|
||||
//dp[x] 表示 x这个节点,到最后一个节点的最短距离
|
||||
for (int i = n - 1; i >= 1; i--) { //从后向前,逐行递推
|
||||
for (int j = 1; j <= n; ++j) { //逐列查找
|
||||
if (a[i][j] > 0) {
|
||||
// j表示从哪个节点,i表示到哪个节点,比如j=6,i=10,表示节点6到节点10的距离是a[i][j]=8
|
||||
// 其实修改的就是dp[i][j]=a[i][j]+dp[i][n]
|
||||
if (a[i][j] + f[j] < f[i]) {
|
||||
f[i] = a[i][j] + f[j];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 1; i <= n; i++) {
|
||||
cout << f[i] << " ";
|
||||
}
|
||||
cout << endl;
|
||||
|
||||
//输出结果
|
||||
cout << f[1];
|
||||
//关闭文件
|
||||
fclose(stdin);
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user