题目链接:http://poj.org/problem?id=1163
思路:典型的动态规划,转换公式为
maxSum[i][j] = max(maxSum[i+1][j],maxSum[i+1][j+1]) + D[i][j]
不过这里可以进行一个优化,把maxSum数组存到原来的D数组的最后一行,每次只要更新数组的最后一行即可,这样就节省了空间。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 150
int map[MAXN][MAXN];
int main()
{
int *maxsum;
int n;
cin >> n;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
cin>>map[i][j];
maxsum=map[n];
for(int i=n-1;i>=1;--i)
for(int j=1;j<=i;j++)
maxsum[j]=max(maxsum[j],maxsum[j+1])+map[i][j];
cout<<maxsum[1]<<endl;
}