动态规划
本来用了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 <iostream>
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;
}