动态规划(引例:三角形求和)
题目
1177: 三角形
时间限制: 1Sec 内存限制: 128MB 提交: 1609 解决: 710
题目描述
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
(图一)
图一表示一个5行的数字三角形。假设给定一个n行数字三角形,计算出从三角形顶至底的一条路径,使该路径经过的数字总和最大。
每一步只能由当前位置向左下或右下。
输入
你的程序要能接受标准输入。第一行包含一个整数T,表示总的测试次数。
对于每一种情况:第一行包含一个整数N,其中1 < N < 100,表示三角形的行数。
接下来的N行输入表示三角形的每一行的元素Ai,j,其中0 < Ai,j < 100。
输出
输出每次测试的最大值并且占一行。
样例输入
1
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出
30
#Include<stdio.h>
#include<string.h>
int main()
{
int n,i,j,a[110][110]={0};
// scanf("%d",&n);
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d\n",&n);
for (i=0;i<=n-1;i++)
{
for (j=0;j<=i;j++)
{
scanf("%d\n",&a[i][j]);
}
}
for (i=n-2;i>=0;i--)
{
for (j=0;j<=i;j++)
{
a[i][j]=a[i][j]+max(a[i+1][j],a[i+1][j+1]);
}
}
printf("%d\n",a[0][0]);
}
return 0;
}
动态规划就是将整个程序分解为小程序,如上题从尾到头依次更新每一步能走的最大值,最后的a[0][0]就是最终所要求得到的值。。