The Triangle
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 36948 | Accepted: 22139 |
Description
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1)
Input
Your program is to read from standard input. The first line contains one integer N: the number of rows in the triangle. The following N lines describe the data of the triangle. The number of rows in the triangle is > 1 but <= 100. The numbers in the triangle, all integers, are between 0 and 99.
Output
Your program is to write to standard output. The highest sum is written as an integer.
Sample Input
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
Sample Output
30
非常简单的题目,基本等于水题了,只有一点点DP的思想。第一次编代码如下:
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN=101;
int a[MAXN][MAXN];
int maxS[MAXN][MAXN];
int main()
{
int n;
scanf("%d",&n);
for (int i=1;i<=n;i++)
for (int j=1;j<=i;j++)
scanf("%d",&a[i][j]);
for (int i=1;i<=n;i++)
maxS[n][i]=a[n][i];
for (int i=n-1;i>=1;i--)
{
for (int j=1;j<=i;j++)
{
maxS[i][j]=a[i][j]+max(maxS[i+1][j],maxS[i+1][j+1]);
}
}
printf("%d\n",maxS[1][1]);
return 0;
}
还可以继续优化。在递推过程中,没必要用二维maxS存储每一个i、j,只要从底层一行行向上递推,只要用一维数组即可。只要存储一行的maxsum值就可以。
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN=101;
int a[MAXN][MAXN];
int *maxS; //取代maxS[100]数组
int main()
{
int n;
scanf("%d",&n);
for (int i=1;i<=n;i++)
for (int j=1;j<=i;j++)
scanf("%d",&a[i][j]);
maxS=a[n]; //第n行
for (int i=n-1;i>=1;i--)
for (int j=1;j<=i;j++)
maxS[j]=a[i][j]+max(maxS[j],maxS[j+1]);
printf("%d\n",maxS[1]);
return 0;
}