#include<bits/stdc++.h>
using namespace std;
using ui=unsigned int;
using ll=long long;
using ull=unsigned long long;
using i128=__int128_t;
using u128=__uint128_t;
using ld=long double;
const ll INF=-1e18;
void solve()
{//dp[i][j]表示以i,j为起点往下移动能获得的最大值 由于这道题会在原数组上进行dp 我们可以直接将原数组当作dp数组
//从最后一行向上开始递推 最后的dp[0][0]即为答案 比从上向下要好
//题中所述|l-r|<=k等价于来到最后一行时 不能偏离中心点超过k 所以在最后一行中 超过这个范围的我们设为INF
//向上递推的过程中 如果dp[i][j]下面的三个值都为INF 则证明这条路不可行 于是将dp[i][j]也设为INF 下次经过这条路时 就知道不能走
int n,k;
cin >> n >> k;
vector<vector<ll>>dp(n);
for(int i=0;i<n;i++)
{
dp[i].resize(2*i+1);
for(int j=0;j<dp[i].size();j++)
{
cin >> dp[i][j];
}
}
for(int i=0;i<2*n-1;i++)
{
if(abs(i-n+1)>k) dp[n-1][i]=INF;
}
for(int i=n-2;i>=0;i--)
{
for(int j=0;j<=2*i;j++)
{
if(max(max(dp[i+1][j],dp[i+1][j+1]),dp[i+1][j+2])>INF)
{
dp[i][j]+=max(max(dp[i+1][j],dp[i+1][j+1]),dp[i+1][j+2]);
}
else
{
dp[i][j]=INF;
}
}
}
cout << dp[0][0];
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t=1;
//cin >> t;
while(t--)
{
solve();
}
return 0;
}