算法导论---学习笔记012

来源:互联网 发布:多多软件站解压密码 编辑:程序博客网 时间:2024/04/28 19:47

题目:


思考:

用一个矩阵s来存储N*N的棋盘,用ans来存储中间过程

(1)初始化:ans[i][j] = s[i][j] (i = N)

(2)递推:ans[i][j] = MAX(s[i+1][j-1], s[i+1][j], s[i+1][j+1]) + s[i][j] (1<=i<N)

(3)结果:answer = MAX(s[i][j]) (i = 1)

代码:

[cpp] view plaincopy
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. #define N 10  
  5. //为了便于处理边界问题  
  6. int map[N+2][N+2];  
  7. int max(int a, int b, int c)  
  8. {  
  9.     if(a > b)  
  10.         return a > c ? a : c;  
  11.     else  
  12.         return b > c ? b : c;  
  13. }  
  14. int main()  
  15. {  
  16.     int i, j, n;  
  17.     while(cin>>n)  
  18.     {<span style="white-space:pre"> </span>memset(map, 0, sizeof(map));  
  19.         //生成随机测试数据  
  20.         for(i = 1; i <= n; i++)  
  21.         {  
  22.             for(j = 1; j <= n; j++)  
  23.             {  
  24.     //          cin>>map[i][j];  
  25.                 map[i][j] = rand() % 10 - 5;  
  26.                 cout<<map[i][j]<<' ';  
  27.             }  
  28.             cout<<endl;  
  29.         }  
  30.         int MAX = -0x7fffffff;  
  31.         //数组s与数组ans合并为数组map  
  32.         //ans[i][j] = s[i][j] (i = N)  
  33.         for(i = n-1; i >= 1; i--)  
  34.         {  
  35.             for(j = 1; j <= n; j++)  
  36.             {  
  37.                 //ans[i][j] = MAX(s[i+1][j-1], s[i+1][j], s[i+1][j+1]) + s[i][j] (1<=i<N)  
  38.                 map[i][j] = map[i][j] + max(map[i+1][j-1], map[i+1][j], map[i+1][j+1]);  
  39.                 //answer = MAX(s[i][j]) (i = 1)  
  40.                 if(i == 1 && map[i][j] > MAX)  
  41.                     MAX = map[i][j];  
  42.             }  
  43.         }  
  44.         cout<<MAX<<endl;  
  45.     }  
  46.     return 0;  
  47. }
0 0
原创粉丝点击