动态规划解决矩阵左上角到右下角距离最大

来源:互联网 发布:国家兴衰周期表知乎 编辑:程序博客网 时间:2024/05/17 22:13
Code:
  1. /****************************************************************** 
  2. funciton:给定一个数字矩阵求从左上角到右下角距离最大。输出最大距离值。 
  3. condition:路径只能是往右与往下走。 
  4. Example 
  5. Input: 
  6. 2 2 
  7. 0  6 
  8. 3  4 
  9. 3 2 
  10. 8 1 9 
  11. 2 2 9 
  12. Output: 
  13. 10 
  14. 27 
  15. Method 
  16. 给定一个距离矩阵用来存放从左上角到该位置的最大距离值。 
  17. 每输入一个值就计算该点的最大距离值。可以知道,该点的最大 
  18. 距离值就是他的上方和左方两者之间最大的距离值。 
  19. ******************************************************************/  
  20. #include <stdio.h>  
  21. #include <time.h>  
  22. #include <stdlib.h>  
  23. #include <malloc.h>  
  24. int main(void)  
  25. {  
  26.     int n;  
  27.     int m;  
  28.     int i;  
  29.     int j;  
  30.     int *a;// 数字矩阵  
  31.     int *d;// 距离矩阵  
  32.     srand((unsigned int)time(NULL));// 随机种子  
  33.     while(scanf("%d%d", &n, &m))  
  34.     {  
  35.         if (m<=n&&n)  
  36.         {  
  37.             a = (int*)malloc(sizeof(int)*n*m);  
  38.             d = (int*)malloc(sizeof(int)*n*m);  
  39.   
  40.             for (i=0; i<m; i++)  
  41.             {  
  42.                 for (j=0; j<n; j++)  
  43.                 {  
  44.                     a[i*n+j] = rand()%10;  
  45.   
  46.                     if (i==0 && j==0)  
  47.                         d[i+j] = a[i+j];// 距离矩阵左上角第一个元素  
  48.   
  49.                     else if (i==0 &&j!=0)  
  50.                     {  
  51.                         d[i*n+j] = d[i*n+j-1]+a[i*n+j];// 第一行的数字  
  52.                     }  
  53.   
  54.                     else if (i!=0&&j==0)  
  55.                     {  
  56.                         d[i*n+j] = d[(i-1)*n+j] + a[i*n+j];// 第一列的数字  
  57.                     }  
  58.   
  59.                     else  
  60.                     {  
  61.                       
  62.                         d[i*n+j]= d[(i-1)*n+j] > d[i*n+j-1] ? d[(i-1)*n+j]: d[i*n+j-1];  
  63.                         d[i*n+j] += a[i*n+j];// 中间的数字都取上方和左方两者最大的  
  64.                     }  
  65.   
  66.                     printf("%3d", a[i*n+j]);  
  67.   
  68.                 }// end for  
  69.                 printf("/n");  
  70.             }//end for  
  71.   
  72.           
  73.         }// end if   
  74.          
  75.         else   
  76.             return 0;  
  77.         printf("%d", d[n*m-1]);  
  78.         free(a);  
  79.         free(d);  
  80.     }// end while  
  81.     return 0;  
  82. }  

 

 

原创粉丝点击