动态规划之求矩阵两点最短路线

来源:互联网 发布:手机淘宝装修与pc同步 编辑:程序博客网 时间:2024/06/05 04:16

给定M*N的矩阵,其中的每个元素都是整数。你的任务是从左上角走到右下角,请找出一条最合适的道路,使得在路上被选取的数字之和尽可能的小。

#include <iostream>#include <stack>#define Max 100#define INF 999999using namespace std;//矩阵网格的左上角到右下角,最短路线,动态规划int v[Max][Max];int a[Max][Max];stack <int> s;//保存路线int fun(int m,int n){//a[m][n]=min{a[m-1][n],a[m][n-1]},最优子结构if(a[m][n]>0)return a[m][n];if(m<0||n<0)return INF;int i=fun(m-1,n);int j=fun(m,n-1);if(i==INF&&j==INF){a[m][n]=v[m][n];return a[m][n];}a[m][n]=i<j?i:j;a[m][n]+=v[m][n];return a[m][n];}void main(){freopen("data.txt","r",stdin);int i,j;for(i=0;i<4;i++)for(j=0;j<4;j++)cin>>v[i][j];cout<<"最短路线的长度是:"<<fun(3,3)<<endl;cout<<"路线是:"<<endl;int t1,t2,m=3,n=3;for(i=0;i<7;i++){t1=t2=INF;s.push(v[m][n]);if(m-1>=0)t1=a[m-1][n];if(n-1>=0)t2=a[m][n-1];if(t1<t2)m--;elsen--;}while(s.size()!=1){cout<<s.top()<<"->";s.pop();}cout<<s.top()<<endl;s.pop();  }

数据和结果如下:


-------2013-12-18 昨晚写了一会没搞出来,今晚重新整理了下思路,出来了。

0 0
原创粉丝点击