题目描述
示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路径,使该路径所经过的数字的总和最大。
每一步可沿左斜线向下或右斜线向下走;
1<三角形行数<25;
三角形中的数字为整数<1000;
输入格式 InputFormat
第一行为N,表示有N行
后面N行表示三角形每条路的路径权
输出格式 OutputFormat
路径所经过的数字的总和最大的答案
SAMPLE INPUT
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
SAMPLE OUTPUT
30
解题报告
DP题,a[i][o]=max(a[i-1][o],a[i-1][o-1])+f[i*(i-1)/2];
感觉写得挺难看...
代码
#include <iostream>
#include <stdio.h>
int maxI(int a,int b)
{
if(a>b)
return a;
else
return b;
}
using namespace std;
int main()
{
int N;
int f[350];
int a[26][26];
scanf("%d",&N);
int NUM=(N+1)*N/2;
for(int i=1;i<=NUM;i++)
scanf("%d",&f[i]);
a[1][1]=f[1];
for(int i=2;i<=N;i++)//层
for(int o=1;o<=i;o++)//列
{ if(o==1)
{
a[i][o]=a[i-1][o]+f[i*(i-1)/2+o];
continue;
}
if(o==i)
{
a[i][o]=a[i-1][o-1]+f[i*(i-1)/2+o];
continue;
}
a[i][o]=maxI((a[i-1][o-1]),(a[i-1][o]))+f[i*(i-1)/2+o];
}
int MAXIMUM=0;
for(int i=1;i<=N;i++)
if(a[N][i]>MAXIMUM)
MAXIMUM=a[N][i];
printf("%d\n",MAXIMUM);
return 0;
}