不知道为什么,我算出来的第一个数是对的,第二个数总是 −1,不知道为什么。
代码:
#include <bits/stdc++.h>
using namespace std;
int n, t[1005][1005], dp[1005][1005], c[1005][1005], m[1005], ans, tot = LLONG_MAX;
void work(int i, int j, int i1, int j1, int i2, int j2, int line, int ex) {
dp[i][j] += (dp[i1][j1] > dp[i2][j2] || dp[i1][j1] == dp[i2][j2] && c[i1][j1] < c[i2][j2]) ? dp[i1][j1] + m[line] : dp[i2][j2] + m[line];
c[i][j] += ((dp[i1][j1] > dp[i2][j2] || dp[i1][j1] == dp[i2][j2] && c[i1][j1] < c[i2][j2]) ? c[i1][j1] : c[i2][j2]) + ((t[i][j] != m[line]) ? 1 : 0);
ans = max(dp[i][j], ans);
tot = min(tot, c[i][j] + ex);
}
void solve(int a) {
memset(dp, 0, sizeof dp);
memset(m, 0, sizeof m);
memset(c, 0, sizeof c);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= i; j++) {
if (!a)
m[i] = max(m[i], t[i][j]);
if (a == 120)
m[i - j] = max(m[i - j], t[i][j]);
if (a == 240)
m[j] = max(m[j], t[i][j]);
}
if (!a)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= i; j++)
work(i, j, i - 1, j - 1, i - 1, j, i, 0);
if (a == 120)
for (int i = n; i; i--)
for (int j = 1; j <= i; j++)
work(i, j, i, j - 1, i + 1, j, i - j, n);
if (a == 240)
for (int j = n; j; j--)
for (int i = n; i >= j; i--)
work(i, j, i, j + 1, i + 1, j + 1, j, 2 * n);
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= i; j++)
cin >> t[i][j];
solve(0);
solve(120);
solve(240);
cout << ans << ' ' << tot;
return 0;
}