题意:
起点是5,每秒移动一格,求这个人最多能接到多少馅饼。
思路:
其实这题跟求数塔的最大和是一样的,用max[x][j],表示第j秒落在了x点。这样的话就是以5为数塔的顶点,直接dp就可以了。
注意:记录x的数组要从1开始,从0开始会越界。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int ma[12][100005],dp[12][100005];
int max1(int x,int y,int z){
int mx;
mx=max(x,y);
mx=max(mx,z);
return mx;
}
int main(){
int n,x,t;
while(scanf("%d",&n)&&n){
memset(ma,0,sizeof(ma));
memset(dp,0,sizeof(dp));
int mx=1;
for(int i=0;i<n;i++){
scanf("%d%d",&x,&t);
if(t>mx) mx=t;
ma[x+1][t]+=1;//避免越界,数组第一维从1开始
}
for(int j=mx;j>=0;j--)
for(int i=1;i<=11;i++)
dp[i][j]=ma[i][j]+max1(dp[i][j+1],dp[i-1][j+1],dp[i+1][j+1]);
printf("%d\n",dp[6][0]);
}
return 0;
}