原问题链接。具体思路以后再写
#include<iostream>
#include<fstream>
using namespace std;
#define N 80
#define min(a,b) ((a)>(b)?(b):(a))
//找到从位置(row,column)到最右段的最小值路径
int findMin(int num[][N],int row,int column,int result[N])
{
int target=result[row];
int temp=0,min=target,tempsum;
for(int i=row-1;i>=0;i--)
{
temp+=num[i][column];
if(temp<target)
{
tempsum=temp+result[i];
if(tempsum<min)
min=tempsum;
}
else
{
break;
}
}
temp=0;
for(int i=row+1;i<N;i++)
{
temp+=num[i][column];
if(temp<target)
{
tempsum=temp+result[i];
if(tempsum<min)
min=tempsum;
}
else
{
break;
}
}
return min;
}
int minPath(int num[][N])
{
int val;
int result[N],temp[N];
for(int i=0;i<N;i++)
{
result[i]=num[i][N-1];
}
for(int i=N-2;i>=0;i--)
{
for(int j=0;j<N;j++)
{
temp[j]=findMin(num,j,i,result);
}
for(int j=0;j<N;j++)
{
result[j]=temp[j]+num[j][i];
}
}
val=result[0];
for(int j=0;j<N;j++)
{
val=min(val,result[j]);
}
return val;
}
void init(int num[][N])
{
int j;
char c;
ifstream ifile("F:/matrix.txt");
for(int i=0;i<N;i++)
{
for(j=0;j<N-1;j++)
{
ifile>>num[i][j]>>c;
}
ifile>>num[i][j];
}
}
void main()
{
int num[N][N];
init(num);
cout<<minPath(num);
system("pause");
}