用DP求解。如果用搜索或是枚举,由于题目数据有R = 1000,用深搜,枚举量很大。用贪心会导致错误解,可以模拟贪心对下面的图算一下,是29。用DP,自顶向下,对每个数,求出顶点到它的最大和,这样保证了正确性,效率高。
        
               / max(F[k -1, i - 1], F[k - 1, i])   (k > 0)
F(k, i) =
               \ F[0, 0]   (k = 0)

                                    7
                                   F:7
                               3        8
                              F:10    F:15
                          8         1         0
                         F:18    F:16    F:15
                   2          7         4           4 
                F:20     F:25     F:23       F:19
           4           5           2         6           5
       F:24       F:30       F:27    F:29       F:24



/**//*
PROG: numtri
LANG: C
*/
#include<stdio.h>
#define max 1000
#define Max(a, b)( a > b ? a : b)
int s[max][max], F[max][max];
int main()
{
    FILE * fin = fopen("numtri.in", "r");
    FILE * fout = fopen("numtri.out", "w");
    int i, j, n;
    fscanf(fin, "%d", &n);
    for (i = 0; i < n; i++)
    {
        for (j = 0; j <= i; j++)
        {
            fscanf(fin, "%d", &s[i][j]); 
            F[i][j] = MAX(i, j);//保存从顶点s[0][0]到s[i][j]的最大和F[i][j]。
        }
    }
    n = 0;
    for (j = 0; j < i; j++)
    {
        n = Max(F[i - 1][j], n);
    }
    fprintf(fout, "%d\n", n);
    return 0; 
}
int MAX(int i, int j)
{
    if (i == 0)
    {
        return s[i][j];
    }
    else
    {
        if (j == 0)
        {
            return s[i][j] + F[i - 1][j];
        }
        else if (j == i)
        {
            return s[i][j] + F[i - 1][j - 1];
        }
        else
        {
            return Max(F[i - 1][j - 1], F[i - 1][j]) + s[i][j];
        }
    }
}