
6 5 1 4 1 6 1 7 2 7 2 8 3 0
4
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int d[11][100001],a[11][100001];
int n,x,t,t0;
int solve(int i,int j){
if(i>10||i<0) return 0; //边界处理 ,很重要
if(d[i][j]>=0) return d[i][j]; //已遍历过,直接返回
return d[i][j]=a[i][j]+(j==t0?0:max(solve(i,j+1),max(solve(i-1,j+1),solve(i+1,j+1))));
//如果是时间边界t0,返回0 **下一秒的同一位置,下一秒的前一位置,下一秒的后一位置
}
int main(){
int i,j;
while(scanf("%d",&n)&&n){
t0=0; //记录最大时间值
memset(d,-1,sizeof(d)); //是否遍历过
memset(a,0,sizeof(a)); //初始化
for(i=0;i<n;i++){
scanf("%d%d",&x,&t);
a[x][t]++; // x 位置 , t 时间
t0=max(t0,t);
}
printf("%d\n",solve(5,0));
}
return 0;
}
原文:http://blog.csdn.net/z_huing/article/details/51361757