21 条题解
-
0
#include #include #include #include #include using namespace std;
typedef long long ll; const int MAXN = 55; const int MAXK = 3; const ll INF = -1e18;
int n; int g[MAXN][MAXN]; vector vals;
ll dp[MAXN][MAXN][MAXK + 1];
vector calc_max(int limit_val, bool is_A) { int max_t = is_A ? MAXK : n * n; for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) for (int k = 0; k <= MAXK; ++k) dp[i][j][k] = INF;
int st = g[0][0]; if (st != 0) { if ((is_A && st > limit_val) || (!is_A && st < limit_val)) { dp[0][0][1] = st; } } dp[0][0][0] = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { if (i == 0 && j == 0) continue; int cur = g[i][j]; bool ok = false; if (cur != 0) { if ((is_A && cur > limit_val) || (!is_A && cur < limit_val)) ok = true; } if (i > 0) { for (int k = 0; k <= MAXK; ++k) { if (dp[i-1][j][k] == INF) continue; if (dp[i][j][k] < dp[i-1][j][k]) dp[i][j][k] = dp[i-1][j][k]; if (ok && k + 1 <= MAXK) { if (dp[i][j][k+1] < dp[i-1][j][k] + cur) dp[i][j][k+1] = dp[i-1][j][k] + cur; } } } if (j > 0) { for (int k = 0; k <= MAXK; ++k) { if (dp[i][j-1][k] == INF) continue; if (dp[i][j][k] < dp[i][j-1][k]) dp[i][j][k] = dp[i][j-1][k]; if (ok && k + 1 <= MAXK) { if (dp[i][j][k+1] < dp[i][j-1][k] + cur) dp[i][j][k] + cur; dp[i][j][k+1] = max(dp[i][j][k+1], dp[i][j-1][k] + cur); } } } } } vector<ll> res(MAXK + 1, INF); for (int k = 0; k <= MAXK; ++k) res[k] = dp[n-1][n-1][k]; return res;}
int main() { freopen("StarPick.in","w",stdin); freopen("StarPick.out","r",stdout); ios::sync_with_stdio(false); cin.tie(0); cin >> n; set s; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { cin >> g[i][j]; if (g[i][j] != 0) s.insert(g[i][j]); } } for (int x : s) vals.push_back(x); ll ans = 0; for (int mid : vals) { auto a = calc_max(mid, true);
auto b = calc_max(mid, false); for (int ka = 1; ka <= 3; ++ka) { if (a[ka] == INF) continue; for (int kb = 0; kb <= ka; ++kb) { if (b[kb] == INF) continue; ans = max(ans, a[ka] + b[kb]); } } } cout << ans << endl; return 0; }
信息
- ID
- 2
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 8
- 标签
- 递交数
- 3736
- 已通过
- 602
- 上传者