【鸽子木·每日一题】数字三角形(3月22日)

【鸽子木·每日一题】数字三角形(3月22日)_第1张图片

动态规划

本来用了dfs,然后写不出来,方向错了。

本题思路:

从上往下的情况比较复杂,情况比较多,所以从下向上思考会比较简单。

7
3 8
8 1 0 
2 7 4 4
4 5 2 6 5

7
3 8
8 1 0 
7 12 10 10

7
3 8
20 13 10 

7
23 21

30

只需要从倒数第二层开始判断,判断下一层两个数字的较大值,一直往上判断,这样一定会遍历每一个数字和情况,而且答案就是arr[0][0]

#include 
using namespace std;
int n;
int arr[501][501];
int main()
{
    scanf("%d",&n); 
    int num = 1;//判断当前所在层数 
    for(int i = 0 ; i < n ; i++)
    {
        for(int j = 0 ; j < num ; j++)
        {    
            scanf("%d",&arr[i][j]);//读入
        }
        num++;//所在层数++ 
    }
    
    for(int i = n-2 ; i >= 0 ; i--)
    //定义的n实际上为数组的arr[n-1][]层
    //又因为最后一层不需要判断更下一层,所以开始判断的层数初始值为n-2 
    {
        for(int j = num-1 ; j >= 0 ; j--)
        {    
            arr[i][j] += max(arr[i+1][j],arr[i+1][j+1]);
        }
        num--;
    }
    printf("%d",arr[0][0]);
    
//输出测试 
//num = 1;
//cout << endl;
//    for(int i = 0 ; i < n ; i++)
//    {
//        for(int j = 0 ; j < num ; j++)
//        {    
//            cout << arr[i][j] << " ";
//        }
//cout << endl;
//        num++;
//    }
    
    return 0;
}

你可能感兴趣的:(动态规划,算法,c++,数据结构)