题目传送门:https://vjudge.net/problem/HDU-2084
好像没什么解释的 ^-^
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
核心:dp[j] = mpa[i][j] + max(dp[j], dp[j + 1]);
每次找寻和最大的
dp数组(初始为0):
i=5时
下标--> | 1 | 2 | 3 | 4 | 5 |
i=5 | (4,5) | (5,2) | (2,6) | (6,5) | (5,0) |
55 6 6 5
依次来推,得到下表
下标--> | 1 | 2 | 3 | 4 | 5 |
第一轮 i=5 | 5 | 5 | 6 | 6 | 5 |
第二轮 i=4 | 7 | 12 | 10 | 10 | 5 |
第三轮 i=3 | 20 | 13 | 10 | 10 | 5 |
第四轮 i=2 | 23 | 21 | 10 | 10 | 5 |
第五轮 i=1 | 30 | 21 | 10 | 10 | 5 |
完整代码:
#include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <queue> #include <set> #include <map> using namespace std; int mpa[105][105]; int dp[105]; int main() { int t; cin >> t; while(t--) { int n; cin >> n; memset(mpa, 0, sizeof(mpa)); memset(dp, 0, sizeof(dp)); for(int i = 1 ; i <= n; i++) for(int j = 1; j <= i; j++) cin >> mpa[i][j]; for(int i = n; i >= 1; i--) { for(int j = 1; j <= n; j++) dp[j] = mpa[i][j] + max(dp[j], dp[j + 1]); } cout << dp[1] << endl; } return 0; }