poj3176 简单dp

来源:互联网 发布:linux黑客版本 编辑:程序博客网 时间:2024/06/02 11:46

就是一个数塔,可以用一维数组节省空间。

状态转移方程:dp[i][j] = a[i][j] + max( dp[i+1][j], dp[i+1][j+1])

#include <iostream>#include <cstdio>using namespace std;#define M 355short a[M][M];int dp[M], n;inline int max(short a, short b){    return a > b ? a : b;}int DP(){    int i, j;    for (i = 0; i < n; i++) dp[i] = a[n-1][i];    for (i = n - 2; i >= 0; i--) {        for (j = 0; j <= i; j++)            dp[j] = a[i][j] + max(dp[j], dp[j+1]);    }    return dp[0];}int main(){    while (scanf ("%d", &n) != EOF) {         for (int i = 0; i < n; i++) {             for (int j = 0; j <= i; j++)                scanf ("%hd", &a[i][j]);         }         printf ("%d\n", DP());    }    return 0;}