题意没申清 刚开始以为在s点s+1和s-1的馅饼也可以捡和0和10不能到(题意坑也不说清楚)最后发现就是水DP。。。
没做任何优化除了用了个滚动数组。。。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int dp[2][13];
int th[100005][13],a,b,c;
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
memset(th,0,sizeof(th));
int ma = -1;
while(n--)
{
scanf("%d%d",&a,&b);
th[b][a]++;
ma = max(ma,b);
}
int pre = 0;
for(int i=0;i<=1;i++)
for(int j=0;j<=10;j++)
dp[i][j] = -9999999;
dp[pre][5] = 0;
for(int i=1;i<=ma;i++)
{
pre = 1-pre;
for(int j=1;j<=9;j++)
dp[pre][j] = max(dp[1-pre][j],max(dp[1-pre][j-1],dp[1-pre][j+1]))+th[i][j];
dp[pre][0] = max(dp[1-pre][0],dp[1-pre][1])+th[i][0];
dp[pre][10] = max(dp[1-pre][10],dp[1-pre][9])+th[i][10];
}
int ans = -1;
for(int i=1;i<=9;i++)
ans = max(ans,dp[pre][i]);
printf("%d\n",ans);
}
}