#include <stdio.h>
#include <vector>
#include <bitset>
using namespace std;
#define maxn 1005
vector <int> tri[maxn];//tine triunghiul initial
struct nod{
int l1,l2,ziua,castig;//ziua repr generatia, pot sa nu o tin minte daca smecheresc niste indici
}coada[maxn*maxn];
//bitset <maxn> calculat[maxn][maxn];
int n;
int suma1(int foaia, int l2,int l3){//foile sunt num incepand cu 1
//latura 1
//printf("SUMA1\n");
int i;
int s=0;
int li=foaia+l3,ls=n-l2;
for(i=li;i<=ls;i++){
s+=tri[i][foaia-1];
//printf("aduna la suma %d\n",tri[i][foaia-1]);
}
return s;
}
int suma2(int foaia,int l1, int l3){
int i;
int s=0;
int li=l1,ls=n-l3-foaia+1;
//printf("SUMA2\n");
for(i=li;i<ls;i++){
s+=tri[n-foaia+1][i];
//printf("aduna la suma %d\n",tri[n-foaia+1][i]);
}
return s;
}
int suma3(int foaia, int l1, int l2){
//printf("SUMA3\n");
int i;
int s=0;
int li=l1+foaia,ls=n-l2;
for(i=li;i<=ls;i++){
s+=tri[i][i-foaia];
//printf("aduna la suma %d\n",tri[i][i-foaia]);
}
return s;
}
int main(){
int k;
int castig=0;
int mdef=-1;
FILE *fin=fopen("ferma2.in","r");
FILE *fout=fopen("ferma2.out","w");
fscanf(fin,"%d%d",&n,&k);
int a;
int i,j;
for(i=1;i<=n;i++){
for(j=0;j<i;j++){
fscanf(fin,"%d",&a);
tri[i].push_back(a);
}
}
int li=0,ls=1;
coada[li].l1=0;
coada[li].l2=0;
coada[li].castig=0;
coada[li].ziua=0;//la sf zilei 0 n-am vandut nimic si castigul e 0
//ATENTIE! nu o marchez ca "calculata"
int l3;
while(li<ls && coada[li].ziua<k){
//expandez coada[li]
//as vrea sa vand o cateta 1
coada[ls].l1=coada[li].l1+1;
coada[ls].l2=coada[li].l2;
coada[ls].ziua=coada[li].ziua+1;
l3=coada[ls].ziua-coada[ls].l1-coada[ls].l2;
coada[ls].castig=coada[li].castig+suma1(coada[ls].l1,coada[ls].l2,l3);
//printf("adaug in coada elementul (%d,%d,%d,%d), care provine din (%d,%d,%d,%d)\n",coada[ls].ziua,coada[ls].l1,coada[ls].l2,coada[ls].castig,coada[li].ziua,coada[li].l1,coada[li].l2,coada[li].castig);
if(mdef<coada[ls].castig)mdef=coada[ls].castig;
//calculat[coada[ls].l1][coada[ls].l2]=1;
ls++;
//daca azi am vandut cateta2
//if(!calculat[coada[li].l1][coada[li].l2+1]){
coada[ls].l1=coada[li].l1;
coada[ls].l2=coada[li].l2+1;
coada[ls].ziua=coada[li].ziua+1;
l3=coada[ls].ziua-coada[ls].l1-coada[ls].l2;
coada[ls].castig=coada[li].castig+suma2(coada[ls].l2,coada[ls].l1,l3);
//calculat[coada[ls].l1][coada[ls].l2]=1;
//printf("adaug in coada elementul (%d,%d,%d,%d), care provine din (%d,%d,%d,%d)\n",coada[ls].ziua,coada[ls].l1,coada[ls].l2,coada[ls].castig,coada[li].ziua,coada[li].l1,coada[li].l2,coada[li].castig);
if(mdef<coada[ls].castig)mdef=coada[ls].castig;
ls++;
//}
//daca azi am vandut ipotenuza
//if(!calculat[coada[li].l1][coada[li].l2]){
coada[ls].l1=coada[li].l1;
coada[ls].l2=coada[li].l2;
coada[ls].ziua=coada[li].ziua+1;
l3=coada[ls].ziua-coada[ls].l1-coada[ls].l2;
coada[ls].castig=coada[li].castig+suma3(l3,coada[ls].l1,coada[ls].l2);
//calculat[coada[ls].l1][coada[ls].l2]=1;
//printf("adaug in coada elementul (%d,%d,%d,%d), care provine din (%d,%d,%d,%d)\n",coada[ls].ziua,coada[ls].l1,coada[ls].l2,coada[ls].castig,coada[li].ziua,coada[li].l1,coada[li].l2,coada[li].castig);
if(mdef<coada[ls].castig)mdef=coada[ls].castig;
ls++;
//}
li++;
}
fprintf(fout,"%d\n",mdef);
//printf("%d\n",suma1(1,0,2));
return 0;
}