#include<stdio.h>
int main()
{
int n,m,i,j;
while(scanf("%d %d",&n,&m)!=EOF)//*n是行,m是列
{
int x,point[201][201];//* point[i][j]=1表示该点有垃圾,否则没有
int f[201][201];//*f[i][j]表示从(1,1)到(i,j)z时,最多捡了多少垃圾,f[i][j]=max(f[i-1][j],f[i][j-1])+point[i][j]
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
scanf("%d",&x); //*输入二维数组
if(x==1)
point[i][j]=1;
else
point[i][j]=0;
}
f[1][1]=point[1][1];//*第一个元素赋值
for(j=2;j<=m;j++)
f[1][j]=f[1][j-1]+point[1][j];//*第一行元素
for(i=2;i<=n;i++)
f[i][1]=f[i-1][1]+point[i][1];//*第一列元素
for(i=2;i<=n;i++) //*注意i,j初始取值
for(j=2;j<=m;j++)
{
if(f[i-1][j]>=f[i][j-1])
f[i][j]=f[i-1][j]+point[i][j];
else
f[i][j]=f[i][j-1]+point[i][j];
}
printf("%d\n",f[n][m]);
}
return 0;
}