1 条题解

  • 0
    @ 2026-2-7 23:15:18

    第一步:暴力解法,用递归遍历每一种可能性,能够拿到基础分数,但数据量大了以后会超时:

    #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

    数字三角形 Number Triangles [IOI 1994 / USACO1.5]

    信息

    ID
    2063
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    6
    已通过
    2
    上传者