知识点:1、数塔;
2、整数(int 型)输入外挂(可大大缩短数据输入的时间,对于数据庞大的题目效果显著)。
#include <cstdio>
#include <memory.h>
//整数输入外挂,减少时间
bool scan_d(int &n)
{
char i;
bool I=0;
i=getchar();
if(i==EOF) return 0;
while(i!='-'&&(i<'0'||i>'9'))
i=getchar();
if(i=='-') I=1,n=0;
else n=i-'0';
while(i=getchar(),i>='0'&&i<='9')
n=n*10+i-'0';
if(I) n=-n;
return 1;
}
//以时间和位置建立二维dp数组,第一维表示时间,第二维表示位置
int dp[100001][11];
int main()
{
int n;
while(scan_d(n),n)
{
memset(dp,0,sizeof(dp));
int x,t,max_t=0;
while(n--)
{
scan_d(x); //整数输入外挂函数调用
scan_d(t);
dp[t][x]++; //用输入数据初始化dp数组
if(max_t<t) max_t=t;
}
//对数塔dp进行处理
for(int i=max_t-1;i>=0;i--)
for(int j=0;j<=10;j++)
{
//状态转移方程:dp[i][j]+=max(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1])
int tmp=dp[i+1][j];
//考虑 j==0 和 j==10 时的特殊情况
if(j&&tmp<dp[i+1][j-1]) tmp=dp[i+1][j-1];
if(j<10&&tmp<dp[i+1][j+1]) tmp=dp[i+1][j+1];
dp[i][j]+=tmp;
}
printf("%d\n",dp[0][5]);
}
return 0;
}