//同样是一个DP的简单入门的题目..想了很久..不过想出来了的感觉真的很好...
//之于状态..最开始一直去想..存在的状态.就只有时间啊..就是第i秒的最优值..
//后来发现..如果这样去考虑的话..并不满足最优子结构原理..即我的最有策略中.第i次不一定是最有的.
//就发现可能是状态考虑错了..后来受到了数字三角的启发..想到,可以用dp[i][j]表示第i秒的时候人在第j位
//能够产生的最优解.
//状态转移方程就是dp[i][j] = max(dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1])当然.这里在0和10的地方就要少一个.
//大概意思是这样子的.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<string.h>
#include<vector>
const int inf = 0x3f3f3f;
const int MN = 110100;
using namespace std;
int x,t,dp[MN][12],n,vis[MN][12];
int main()
{
while(scanf("%d",&n) && n != 0)
{
int maxx = -inf;
memset(vis,0,sizeof(vis));
for(int i = 1 ; i <= n ; i++)
{
scanf("%d%d",&x,&t);
vis[t][x]++;
maxx = max(maxx,t);
}
memset(dp,0,sizeof(dp));
if(vis[1][4])dp[1][4] = vis[1][4];
if(vis[1][5])dp[1][5] = vis[1][5];
if(vis[1][6])dp[1][6] = vis[1][6];
for(int i = 2 ; i <= maxx ; i++)
{
for(int j = 0 ; j <= 10 ; j++)
{
if(j != 0 && j != 10)
{
dp[i][j] = max( dp[i-1][j],dp[i-1][j-1] );
dp[i][j] = max( dp[i][j],dp[i-1][j+1] );
}
else
{
if(j == 0)
{
dp[i][j] = max( dp[i-1][j],dp[i-1][j+1] );
}
else
{
dp[i][j] = max( dp[i-1][j],dp[i-1][j-1] );
}
}
if(i >= abs(j - 5))
dp[i][j] += vis[i][j];
}
}
int ans = -inf;
for(int i = 0 ; i <= 10 ; i++)
{
if(ans < dp[maxx][i])
ans = dp[maxx][i];
}
printf("%d\n",ans);
}
}