Cod sursa(job #2474605)

Utilizator mihai50000Mihai-Cristian Popescu mihai50000 Data 15 octombrie 2019 16:38:49
Problema Ferma2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("ferma2.in");
ofstream fout("ferma2.out");

const int DIM = 1007;

int v[DIM][DIM];
int sp1[DIM][DIM];
int sp2[DIM][DIM];
int sp3[DIM][DIM];
int dp[DIM][DIM];

main()
{
	int n, k;
	fin >> n >> k;
	
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= i; j++)
		{
			fin >> v[i][j];
			
			sp1[i][j] = v[i][j] + sp1[i][j - 1];
			sp2[i][j] = v[i][j] + sp2[i - 1][j];
			sp3[i][j] = v[i][j] + sp3[i - 1][j - 1];
		}
	
	int sum = 0;
	
	k = n - k;
	
	for(int i = 1; i <= k; i++)
		for(int j = 1; j <= i; j++)
			sum += v[i][j];
	
	dp[k][k] = sum;
	
	int res = sum;
	
	for(int i = k + 1; i <= n; i++)
	{
		dp[i][k] = dp[i - 1][k] + sp1[i][k] - sp3[i - 1][k];
		res = min(res, dp[i][k]);
	}
	
	for(int i = k + 1; i <= n; i++)
		for(int j = k + 1; j <= i; j++)
		{
			dp[i][j] = dp[i][j - 1] + sp3[i][j] - sp3[i - k][j - k] - sp2[i][j - k] + sp2[i - k][j - k];
			res = min(res, dp[i][j]);
		}
	
	res = -res;
	
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= i; j++)
			res += v[i][j];
	
	fout << res;
}