如题:http://poj.org/problem?id=1163
简单DP,练练手,dp[i][j]表示i行第j个元素之前的最大和。易得dp[i][j]=max{dp[i-1][j-1],dp[i-1][j]}+map[i][j]; dp[i-1][j]是相对map[i][j]左上角元素,dp[i-1][j]是右上角的元素。
优化:dp[i][x]只与dp[i-1[x],dp[i-1][x-1]有关。滚动数组。dp[i%2][j]=max{dp[(i-1)%2][j-1],dp[(i-1)%2][j]}+map[i][j];
#include<iostream>
using namespace std;
#define N 102
#define max(a,b)(a>b?a:b)
int map[N][N];
int dp[2][N];
int n;
int main()
{
// freopen("C:\\1.txt","r",stdin);
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
scanf("%d",&map[i][j]);
memset(dp,0,sizeof(dp));
int max=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
dp[i%2][j]=max(dp[(i-1)%2][j-1],dp[(i-1)%2][j])+map[i][j];
if(dp[i%2][j]>max) max=dp[i%2][j];
}
printf("%d\n",max);
return 0;
}