【算法设计与分析】 最短路径问题(动态规划)
程序员文章站
2022-05-23 10:05:54
...
【算法设计与分析】 最短路径问题(动态规划)
【问题描述】
假设一个矩阵mat的大小为M行N列,矩阵每个位置上有大于或等于0的整数,现从左上角[1, 1]开始,每次只能向下或向右走一步,最后到达右下角[M, N],路径上的数字累加就是路径和。现要求最短路径和以及最短的路径。
【输入形式】
在屏幕上输入矩阵大小,以及矩阵每个元素的值。
【输出形式】
最短路径和,以及最短路径。
【样例1输入】
4 4
1 3 5 9
8 1 3 4
5 0 6 1
8 8 4 0
【样例1输出】
12
1 1
1 2
2 2
3 2
3 3
3 4
4 4
【样例说明】
输入:矩阵大小为4行4列。从第二行开始是矩阵每个位置上的数字(大于或等于0的整数)。所有数字间以空格间隔。
输出:第一行输出最短路径和12,第二行开始是从左上角[1, 1]开始的最短路径上的矩阵位置(以行号和列号表示,以空格间隔)。
【题解代码】
C++代码:
#include <iostream>
#include <cstdio>
#include <stack>
using namespace std;
int r,c,dis[105][105],dir[105][105];
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>r>>c;
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
cin>>dis[i][j];
for(int i=2;i<=r;i++)
{
dis[i][1]+=dis[i-1][1];
dir[i][1]=1;//从上向下走
}
for(int j=2;j<=c;j++)
{
dis[1][j]+=dis[1][j-1];
dir[1][j]=2;//从左向右走
}
for(int i=2;i<=r;i++)
for(int j=2;j<=c;j++)
{
if(dis[i][j]+dis[i-1][j]<=dis[i][j]+dis[i][j-1])
{
dis[i][j]+=dis[i-1][j];
dir[i][j]=1;
}//从上向下走
else
{
dis[i][j]+=dis[i][j-1];
dir[i][j]=2;
}//从左向右走
}//动态规划
stack<pair<int,int> > ans;
int tr=r,tc=c;
while(!(tr==1&&tc==1))
{
ans.push({tr,tc});
if(dir[tr][tc]==1)
tr--;
else
tc--;
}
ans.push({1,1});
cout<<dis[r][c]<<endl;//最短路径长度
while(!ans.empty())
{
cout<<ans.top().first<<" "<<ans.top().second<<endl;
ans.pop();
}//输出路径
return 0;
}
上一篇: spring bean的创建方式
下一篇: java类的装载