最基础的DP了。
用二维数组把数据储存起来,dp[110][110]。
从下往上走,每一步都选最优,则每个节点都是往下走的最优解,因此,走到最后,dpdp[1][1]就是最优的了。
关键在于——在最底层,每一个节点都是最优解。要注意题目中给出的数字三角形与INPUT中给出的数字三角形的不一致。
状态转移方程为dp[i][j]=max(dp[i+1][j],dp[i+1][j+1]).
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cmath>
using namespace std;
int dp[110][110];
int main()
{
int i,j,k,n;
while(cin>>n)
{
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
{
cin>>dp[i][j];
}
for(i=n-1;i>=1;i--)
for(j=i;j>=1;j--)
{
dp[i][j]+=max(dp[i+1][j],dp[i+1][j+1]);
}
cout<<dp[1][1]<<endl;
}
}