#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,k;
int a[305][605],dp[305][605];
//存在负数的用例,ans初始最大值不能是-1,必须是一个极小的负数
int l,r,ans=-4e18;
signed main()
{
cin>>n>>k;
// 将整个dp数组初始化为极小的负数,表示该位置不可达
for(int i=1;i<=n;i++)
{
for(int j=1;j<=2*n;j++)
{
dp[i][j]=-4e18;
}
}
for(int i=1;i<=n;i++)
{
int m=2*i-1;
for(int j=1;j<=m;j++)
{
cin>>a[i][n-i+j];
}
}
dp[1][n]=a[1][n];
for(int i=2;i<=n;i++)
{
int m=2*i-1;
for(int j=1;j<=m;j++)
{
int col=n-i+j;
dp[i][col] = max({dp[i-1][col-1], dp[i-1][col], dp[i-1][col+1]}) + a[i][col];
}
}
for(int j=1;j<=2*n-1;j++)
{
//题目要求的限制条件|l-r|<=k,在数学上完全等价于最终到达的列数|C-n|<=k满足!
if(abs(j-n)<=k)
{
ans=max(ans,dp[n][j]);
}
}
cout<<ans;
return 0;
}