#include<iostream>
#include<algorithm>
#include<stdio.h>
int Triangle[102][102];
int dp[102][102];
using namespace std; //yitiao
int main()
{
int num;
cin>>num;
for(int i=1;i<=num;i++)
for(int j=1;j<=i;j++)
{
scanf("%d",&Triangle[i][j]);
}
dp[1][1]=Triangle[1][1];int MAX=dp[1][1]; //设置初始值
for(int i=2;i<=num;i++)
for(int j=1;j<=i;j++)
{
dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+Triangle[i][j]; //所有的值只能来自上一行的两个数,当然边界的值只能来自一边,所以另一边的值全部置为0
if(dp[i][j]>MAX)
MAX=dp[i][j]; //判断最大值可以不用写
}
cout<<MAX<<endl;//cout<<*max_element(dp[num],dp[num]+num)<<endl;最大值只出现在最后一行所以用这个判断再好不过
}
很明显的动态规划题目
题目来自:http://acm.nyist.net/JudgeOnline/problem.php?pid=18