Cod sursa(job #638489)
#include <fstream>
using namespace std;
int N, K, Sum, minV;
int A[1002][1002], L[1002][1002], C[1002][1002], D[1002][1002];
int S[1002][1002];
int main()
{
ifstream fin("ferma2.in");
ofstream fout("ferma2.out");
fin >> N >> K;
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= i; ++j)
{
fin >> A[i][j];
Sum += A[i][j];
}
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= N; ++j)
{
L[i][j] = L[i][j - 1] + A[i][j];
C[i][j] = C[i - 1][j] + A[i][j];
D[i - j + 1][i] = D[i - j + 1][i - 1] + A[i][j];
}
K = N - K;
for (int i = 1; i <= K; ++i)
S[1][1] += L[i][i];
minV = S[1][1];
for (int i = 2; i <= N - K + 1; ++i)
for (int j = 1; j <= i; ++j)
{
if (j != i)
S[i][j] = S[i - 1][j] - (D[i - j][i + K - 2] - D[i - j][i - 2]) + (L[i + K - 1][j + K - 1] - L[i + K - 1][j - 1]);
else
S[i][j] = S[i][j - 1] - (C[i + K - 1][j - 1] - C[i - 1][j - 1]) + (D[i - j + 1][i + K - 1] - D[i - j + 1][i - 1]);
minV = min(minV, S[i][j]);
}
fout << Sum - minV << '\n';
fin.close();
fout.close();
}