喂,你都趴在地上
半小时了,蚂蚁有
那么好看吗?
/
STO . OPZ
你瞧,它在前进的路上
有很多种选择,它不知
道哪条路上有食物...
/
STO .OPZ
. .
█/
○
▪
7
/
3 8
/ /
8 1 0
/ / /
2 7 4 4
/ / / /
4 5 2 6 5
○
/█
' '
一只蚂蚁从n行的数字三角形顶部出发往下爬,只能往左下或右下爬,问如何爬才能让它经过的数字和最大?
【输入】
第一行一个整数n,表示三角形行数
接下来的n行是数字三角形
【输出】
经过的数字总和最大值
【样例输入】
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
【样例输出】
30
【输出说明】
7+3+8+7+5=30
题解:
我的第一反应是搜索,但是......T!L!E!
因此我换了一种思路:用动态规划。
从顶部出发和从底部出发是一样的,
每个顶点更新为当前顶点的值加上下面两个顶点的值的最大值,从下往上搜索。
动规思路如下:
2 7 4 4 ==> 7 12 10 10
4 5 2 6 5 4 5 2 6 5
8 1 0 ==> 20 13 10
7 12 10 10 7 12 10 10
3 8 ==> 23 21
20 13 10 20 13 10
7 ==> 30
23 21 23 21
因此答案为30。
上代码
1 #include<iostream> 2 using namespace std; 3 int a[105][105],b[105][105]; 4 int n; 5 int main() 6 { 7 cin>>n; 8 int i,j; 9 for(i=1;i<=n;i++) 10 for(j=1;j<=i;j++) 11 cin>>a[i][j]; 12 for(i=1;i<=n;i++) 13 b[n][i]=a[n][i]; 14 for(i=n-1;i>=1;i--) 15 for(j=1;j<=i;j++) 16 b[i][j]=a[i][j]+max(b[i+1][j],b[i+1][j+1]); 17 cout<<b[1][1]; 18 return 0; 19 }