//DP入门,数塔, HDU 2084
//以C++编译器提交
#include <iostream>
using namespace std;
#define N 100
int f[N][N];
//状态:f[i,j], 算到第i行j列时的最大值
//转移方程:f[i,j]=f[i,j]+max(f[i-1,j],f[i-1,j-1])
//初值:直接输入
//结果:max(f[n-1,j]), 0<=j<n
int dpDown(int n)//从上往下算
{
int i, j, maxVal;
for(i=1;i<n;i++) //第一列只能从上面竖走下来
{
f[i][0] = f[i-1][0] + f[i][0];
}
for(i=1;i<n;i++)//从第二行开始做
{
for(j=1;j<=i;j++)
{
if (f[i-1][j]>f[i-1][j-1])//斜走、竖走中取大者
f[i][j] = f[i][j] + f[i-1][j];
else
f[i][j] = f[i][j] + f[i-1][j-1];
}
}
//取最后一行中的最大值
maxVal=f[n-1][0];
for(i=1;i<n;i++)
{
if (maxVal<f[n-1][i]) maxVal=f[n-1][i];
}
return maxVal;
}
//状态:f[i,j], 算到第i行j列时的最大值
//转移方程:f[i,j]=f[i,j]+max(f[i+1,j],f[i+1,j+1])
//初值:直接输入
//结果:f[0,0]
int dpUp(int n)//从下往上算
{
int i, j;
for(i=n-2;i>=0;i--) //从倒数第二行开始做
{
for(j=0;j<=i;j++)
{
if (f[i+1][j]>f[i+1][j+1])//斜走、竖走中取大者
f[i][j] += f[i+1][j];
else
f[i][j] += f[i+1][j+1];
}
}
return f[0][0];
}
void run()
{
int i, j, n, res;
scanf("%d", &n);
for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
{
scanf("%d", &f[i][j]);
}
}
//res=dpDown(n);
res=dpUp(n);
printf("%d\n", res);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("e:\\input.txt","r",stdin);
#endif
int i, n;
scanf("%d", &n);
for(i=0;i<n;i++) run();
return 0;
}