1 条题解
-
0
第一步:暴力解法,用递归遍历每一种可能性,能够拿到基础分数,但数据量大了以后会超时:
#include <iostream> #include<math.h> using namespace std; int d[1001][1001]; int n; int f(int i,int j) { if (i == n) return d[i][j]; int x = f(i + 1, j); int y =f(i + 1, j + 1); return max(x, y) + d[i][j]; } int main(){ //数字三角形 Number Triangles cin >> n; for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { cin >> d[i][j]; } } /*for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { cout<<d[i][j]<<" "; } cout << endl; }*/ cout<<f(1,1); return 0; }第二步:在递归过程中使用数组记录计算过程,避免重复计算,能拿到更多的分数,但依然拿不到满分。尽管如此,在搜索过程中记录结果、减少搜索次数的思想即是“记忆化搜索”,需要牢记这个内容。
#include <iostream> #include<math.h> using namespace std; int d[1001][1001]; int maxsum[1001][1001]; int n; int f(int i,int j) { if (maxsum[i][j]) return maxsum[i][j]; if (i == n) { maxsum[i][j]=d[i][j]; }else { int x = f(i + 1, j); int y = f(i + 1, j + 1); maxsum[i][j] = max(x, y) + d[i][j]; } /*cout << "\n---分割线---\n"; for (int ii = 1; ii <= n; ii++) { for (int jj = 1; jj <= ii; jj++) { cout << maxsum[ii][jj] << " "; } cout << endl; } cout << "\n---分割线---\n";*/ return maxsum[i][j]; } int main(){ //数字三角形 Number Triangles cin >> n; for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { cin >> d[i][j]; } } cout<<f(1,1); return 0; }第三步:递归转递推,从下往上累加最大值,即可拿到全部分数:
#include <iostream> using namespace std; int arr[1010][1010]; int main(){ int r; cin >> r; for (int i = 1; i <= r; i++) { for (int j = 1; j <= i; j++) { cin >> arr[i][j]; } } for (int i = r-1; i >=1 ; i--) { for (int j = 1; j <= i; j++) { arr[i][j]+=max(arr[i+1][j],arr[i+1][j+1]); } } /* for (int i = 1; i <= r; i++) { for (int j = 1; j <= i; j++) { cout<<arr[i][j]<<" "; } cout << endl; }*/ cout << arr[1][1]; return 0; }
- 1
信息
- ID
- 2063
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 6
- 已通过
- 2
- 上传者