Cod sursa(job #696563)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 28 februarie 2012 18:59:33
Problema Ferma2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <cstdio>
#include <iostream>
using namespace std;

int tr[104][105];
int dp[104][105];

int main()
{	
	int n,k,S=0,Smin=1<<30;
	freopen("ferma2.in","r", stdin);
	freopen("ferma2.out","w", stdin);
	scanf("%d %d",&n,&k);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=i;j++)
		{
			scanf("%d",&tr[i][j]);
			S+=tr[i][j];
		}

	/*for(int i=1;i<=n;i++,cout<<endl)
		for(int j=1;j<=i;j++)
			cout<<tr[i][j]<<" ";*/
	
	// sume partiale
	for(int i=1;i<=n;i++)
	{
		int c=i;
		int l=1;
		dp[l][c]=tr[l][c];
		while(l<=n && c<=n)
		{
			l++;
			c++;
			dp[l][c]+=dp[l-1][c-1]+tr[l][c];
		}
		c=1;
		l=i;
		if(dp[l][c]==0) // sa nu merg de 2 ori pe diag principala 
		{
			dp[l][c]=tr[l][c];
			while(l<=n && c<=n)
			{
				l++;
				c++;
				dp[l][c]+=dp[l-1][c-1]+tr[l][c];
			}
		}
	}
	/*for(int i=1;i<=n;i++,cout<<endl)
		for(int j=1;j<=i;j++)
			cout<<dp[i][j]<<" ";	
		cout<<S<<endl;*/
	
	// caut triunghi de latura n-k
	for(int i=n-k-1;i<=n;i++)
		for(int j=1;j+n-k-1<=i;j++)
		{
			int Str=0,ind=1;
			for(int c=j;c<j+n-k;c++)
			{
				Str+=dp[i][c]-dp[i-ind][j-1];
				//cout<<" : "<<dp[i][c]<<" - : "<<dp[i-ind][j-1]<<" : ind :"<<ind<<endl;
				ind++;
			}
			Smin=min(Str,Smin);
		}

	cout<<S-Smin;
	return 0;
}