给定M*N的矩阵,其中的每个元素都是整数。你的任务是从左上角走到右下角,请找出一条最合适的道路,使得在路上被选取的数字之和尽可能的小。
#include <iostream>
#include <stack>
#define Max 100
#define INF 999999
using 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--;
else n--;
}
while(s.size()!=1)
{
cout<<s.top()<<"->";
s.pop();
}
cout<<s.top()<<endl;
s.pop();
}
数据和结果如下:
-------2013-12-18 昨晚写了一会没搞出来,今晚重新整理了下思路,出来了。