HDU-2084 基础dp

来源:互联网 发布:超悦软件v8000 编辑:程序博客网 时间:2024/06/15 17:18

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2084

题意:比较经典的一道题目,给一个数塔,从顶端走到底端,能走相邻位置,求路径最大权值。

思路:从最后一层往前面考虑,因为最多可能有n个出口,并且都在最底层,所以从这里往前面推,每往上一格所得到的最优解都是这个出口的最优解。所以就可以很简单的写出状态转移方程:dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+mat[i][j]。

#include <stdio.h>#include <algorithm>#include <math.h>#include <iostream>using namespace std;const int maxn = 102;int dp[maxn][maxn],mat[maxn][maxn];int main(){    int t;    scanf("%d",&t);    while(t--){        int n;        scanf("%d",&n);        for(int i=1;i<=n;i++){            for(int j=1;j<=i;j++){                scanf("%d",&mat[i][j]);            }        }        for(int i=1;i<=n;i++)            dp[n][i]=mat[n][i];        for(int i=n-1;i>=1;i--){            for(int j=1;j<=i;j++){                dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+mat[i][j];            }        }        printf("%d\n",dp[1][1]);    }    return 0;}