动态规划解决矩阵左上角到右下角距离最大(转 http://blog.youkuaiyun.com/ycc892009/article/details/6523167)

/****************************************************************** 
 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;  
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值