您的位置:首页 > 其它

HDU 2084 数塔 --- 入门DP

2015-12-27 04:55 337 查看
HDU 2084 数塔

从下往上递推,状态转移方程 dp[i][j] = max( dp[i+1][j], dp[i+1][j+1]) + a[i][j];

/* HDU 2084 数塔 --- 入门DP */
#include <cstdio>

const int N = 105;
int dp

;

int MAX(int a, int b){
return a > b ? a : b;
}

int main()
{
#ifdef _LOCAL
freopen("D:\\input.txt", "r", stdin);
#endif
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", &dp[i][j]);
}
}
////dp[i][j]记录从底部往上走到i,j的最大路径,最终结果和即dp[1][1]即为最长的路径
//for (int i = 1; i <= n; ++i){
//    //最后一行的dp初始化为a[i][j]本身的值;
//    dp
[i] = a
[i];
//}

//状态转移方程: dp[i][j] = max(d[i+1][j] + dp[i+1][j+1]) + a[i][j]
//即到达下一行的两个邻接点的最大值加上该点的值即为该点的最大值.
for (int i = n - 1; i > 0; --i){
//第i行有i个数,从下往上走,
for (int j = 1; j <= i; ++j){
dp[i][j] = MAX(dp[i + 1][j], dp[i + 1][j + 1]) + dp[i][j];
//直接使用dp[i][j]可以省去一个数组的值
//dp[i][j] = MAX(dp[i + 1][j], dp[i + 1][j + 1]) + a[i][j];
}
}
//从下往上递推可以省去最后一循环找最大值而直接去dp[1][1]
printf("%d\n", dp[1][1]);
}

return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: