USACO 1.5.1 Number Triangles
题意:经典数字三角形最大问题
解法:基本动态规划
dp[i][j]表示以(i,j)结束的最大值, 转移方程:dp[i][j] = max{dp[i-1][j-1], dp[i-1][j]} + num[i][j], 结果为max dp[n - 1][j]
当然也可以设置dp[i][j]表示从(i, j)出发所能获得的最大值 dp[i][j] = max{dp[i+1][j], dp[i+1][j+1]} + num[i][j]
USACO题目的复杂度有些跳跃
/* ID: lsswxr1 PROG: numtri LANG: C++ */ #include <iostream> #include <vector> #include <map> #include <list> #include <set> #include <deque> #include <stack> #include <queue> #include <algorithm> #include <cmath> #include <cctype> #include <cstdio> #include <iomanip> #include <cmath> #include <cstdio> #include <string> #include <cstring> #include <fstream> using namespace std; #define USACO #ifdef USACO #define cin fin #define cout fout #endif ////////////////////////////////////////////////////////////////////////// ///宏定义 const int INF = 1000000000; const int MAXN = 1021; const int maxn = MAXN; ///全局变量 和 函数 int R; int num[maxn][maxn]; int dp[maxn][maxn]; int main() { #ifdef USACO ofstream fout ("numtri.out"); ifstream fin ("numtri.in"); #endif while (cin >> R) { for (int i = 0; i < R; i++) { for (int j = 0; j < i + 1; j++) { cin >> num[i][j]; dp[i][j] = -INF; } } int ans = 0; dp[0][0] = num[0][0]; for (int i = 1; i < R; i++) { for (int j = 0; j < i + 1; j++) { if (j - 1 >= 0) { dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + num[i][j]); ans = max(ans, dp[i][j]); } if (j < i) { dp[i][j] = max(dp[i][j], dp[i - 1][j] + num[i][j]); ans = max(ans, dp[i][j]); } } } cout << ans << endl; } ///结束 return 0; }