题目:http://poj.org/problem?id=3176
AC代码(C++):
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <queue>
#include <math.h>
#include <string>
#include <string.h>
#include <bitset>
#define INF 0xfffffff
#define MAXN 100105
using namespace std;
int n;
int num[400][400];
int dp[400][400];
int main(){
scanf("%d",&n);
for(int i = 1; i <= n; i++){
for(int j = 1; j <= i; j++){
scanf("%d",&num[i][j]);
}
}
memset(dp,0,sizeof(dp));
int MAX = 0;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n+1-i; j++){
dp[i][j] = max(dp[i-1][j]+num[i+j-1][j],dp[i][j-1]+num[i+j-1][j]);
if(i+j-1==n&&dp[i][j]>MAX)MAX = dp[i][j];
}
}
cout<<MAX;
}
总结: 动态规划. dp[i][j]代表往左走i-1步和往右走j-1步时最大sum.