/******************************************************************
funciton:给定一个数字矩阵求从左上角到右下角距离最大。输出最大距离值。
condition:路径只能是往右与往下走。
Example
Input:
2 2
0 6
3 4
3 2
8 1 9
2 2 9
Output:
10
27
Method
给定一个距离矩阵用来存放从左上角到该位置的最大距离值。
每输入一个值就计算该点的最大距离值。可以知道,该点的最大
距离值就是他的上方和左方两者之间最大的距离值。
******************************************************************/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <malloc.h>
int main(void)
{
int n;
int m;
int i;
int j;
int *a;// 数字矩阵
int *d;// 距离矩阵
srand((unsigned int)time(NULL));// 随机种子
while(scanf("%d%d", &n, &m))
{
if (m<=n&&n)
{
a = (int*)malloc(sizeof(int)*n*m);
d = (int*)malloc(sizeof(int)*n*m);
for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
a[i*n+j] = rand()%10;
if (i==0 && j==0)
d[i+j] = a[i+j];// 距离矩阵左上角第一个元素
else if (i==0 &&j!=0)
{
d[i*n+j] = d[i*n+j-1]+a[i*n+j];// 第一行的数字
}
else if (i!=0&&j==0)
{
d[i*n+j] = d[(i-1)*n+j] + a[i*n+j];// 第一列的数字
}
else
{
d[i*n+j]= d[(i-1)*n+j] > d[i*n+j-1] ? d[(i-1)*n+j]: d[i*n+j-1];
d[i*n+j] += a[i*n+j];// 中间的数字都取上方和左方两者最大的
}
printf("%3d", a[i*n+j]);
}// end for
printf("/n");
}//end for
}// end if
else
return 0;
printf("%d", d[n*m-1]);
free(a);
free(d);
}// end while
return 0;
}
动态规划解决矩阵左上角到右下角距离最大(转 http://blog.youkuaiyun.com/ycc892009/article/details/6523167)
最新推荐文章于 2023-09-06 17:42:53 发布