51nod 1002 数塔取数

来源:互联网 发布:广联达软件视频教学 编辑:程序博客网 时间:2024/05/22 17:41
一个高度为N的由正整数组成的三角形,从上走到下,求经过的数字和的最大值。
每次只能走到下一层相邻的数上,例如从第3层的6向下走,只能走到第4层的2或9上。

   5
  8 4
 3 6 9
7 2 9 5

例子中的最优方案是:5 + 8 + 6 + 9 = 28
Input
第1行:N,N为数塔的高度。(2 <= N <= 500)第2 - N + 1行:每行包括1层数塔的数字,第2行1个数,第3行2个数......第k+1行k个数。数与数之间用空格分隔(0 <= A[i] <= 10^5) 。
Output
输出最大值
Input示例
458 43 6 97 2 9 5
Output示例
28

#include <stdio.h>int main(){int n, i, j, max;int tower[501][501];int dp[501][501];scanf("%d", &n);for (i = 0; i < n; i++)for (j = 0; j <= i; j++)scanf("%d", &tower[i][j]);dp[0][0] = tower[0][0];max = dp[0][0];for (i = 1; i < n; i++){for (j = 0; j <= i; j++){if (j == 0 || dp[i - 1][j - 1] <= dp[i - 1][j])dp[i][j] = dp[i - 1][j] + tower[i][j];else if (j == i || dp[i - 1][j - 1] >= dp[i - 1][j])dp[i][j] = dp[i - 1][j - 1] + tower[i][j];if (dp[i][j] > max)max = dp[i][j];}}printf("%d\n", max);return 0;}