Problem F ID:1006
简单题意:给出一个数塔,从顶层走到底层,每一步只能走到相邻的结点,求经过的结点的最大数字之和。
解题思路形成过程:从上到下,从倒数第二层开始,每一个结点均有两个选择:自己本身的数加上左儿子或者自己本身的数加上右儿子,两者的数求取最大值,最大值便是此结点的最大值。按照此方法,从倒数第二次依次遍历到最顶层。此时最顶层的数便是从顶层走到底层的数字之和的最大值。
感想:一个比较简单的DP题,自己测试的时候还是debug了好一会儿,注意细节!
代码:#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int a[20000][20000];
int num;
void dp()
{
for(int i=num-2;i>=0;--i)
for(int j=0;j<i+1;++j)
a[i][j]+=max(a[i+1][j],a[i+1][j+1]);
}
int main()
{
//freopen("1.txt","r",stdin);
int n;
scanf("%d",&n);
while(n--)
{
scanf("%d",&num);
for(int i=0;i<num;++i)
for(int j=0;j<i+1;++j)
scanf("%d",&a[i][j]);
dp();
printf("%d\n",a[0][0]);
}
return 0;
}
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int a[20000][20000];
int num;
void dp()
{
for(int i=num-2;i>=0;--i)
for(int j=0;j<i+1;++j)
a[i][j]+=max(a[i+1][j],a[i+1][j+1]);
}
int main()
{
//freopen("1.txt","r",stdin);
int n;
scanf("%d",&n);
while(n--)
{
scanf("%d",&num);
for(int i=0;i<num;++i)
for(int j=0;j<i+1;++j)
scanf("%d",&a[i][j]);
dp();
printf("%d\n",a[0][0]);
}
return 0;
}