题目:
思考:
用一个矩阵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)
代码:
- #include <iostream>
- using namespace std;
- #define N 10
- //为了便于处理边界问题
- int map[N+2][N+2];
- int max(int a, int b, int c)
- {
- if(a > b)
- return a > c ? a : c;
- else
- return b > c ? b : c;
- }
- int main()
- {
- int i, j, n;
- while(cin>>n)
- {<span style="white-space:pre"> </span>memset(map, 0, sizeof(map));
- //生成随机测试数据
- for(i = 1; i <= n; i++)
- {
- for(j = 1; j <= n; j++)
- {
- // cin>>map[i][j];
- map[i][j] = rand() % 10 - 5;
- cout<<map[i][j]<<' ';
- }
- cout<<endl;
- }
- int MAX = -0x7fffffff;
- //数组s与数组ans合并为数组map
- //ans[i][j] = s[i][j] (i = N)
- for(i = n-1; i >= 1; i--)
- {
- for(j = 1; j <= n; j++)
- {
- //ans[i][j] = MAX(s[i+1][j-1], s[i+1][j], s[i+1][j+1]) + s[i][j] (1<=i<N)
- map[i][j] = map[i][j] + max(map[i+1][j-1], map[i+1][j], map[i+1][j+1]);
- //answer = MAX(s[i][j]) (i = 1)
- if(i == 1 && map[i][j] > MAX)
- MAX = map[i][j];
- }
- }
- cout<<MAX<<endl;
- }
- return 0;
- }