传送门:免费馅饼
分析:
1.t时刻,x坐标会掉落一块馅饼,要求到最后一秒时捡到的馅饼数目最多。这题属于动态规划内容。
2.因为初始位置已经固定了,所以从一开始推起不好推,我们不妨从后往前推,从最后一秒开始,接着,我们就要找到最后一秒和倒数第二秒的关系,即寻找状态方程,我们可以知道最后一秒的位置取决于前一秒的位置的状态,而前一秒位置有三种状态(保持不动or向前一步or向后一步),又因为要从后往前推,所以我们最后一秒的走路的最大值往前不断叠加,叠加到最初始的位置即为最优解了。
AC代码:
#include<iostream>
#include<cstring>
using namespace std;
int dp[100010][15];
int max(int a,int b,int c){
int max1=a;
if(b>max1) max1=b;
if(c>max1) max1=c;
return max1;
}
int main(){
int n,x,t;
while(~scanf("%d",&n)){
if(n==0) break;
memset(dp,0,sizeof(dp));
int max_t=0;
for(int i=0;i<n;i++){
scanf("%d%d",&x,&t);
dp[t][x+1]++; //每个位置的馅饼数记一下
if(t>max_t) max_t=t;
}
for(int i=max_t;i>=1;i--)
for(int j=1;j<=11;j++)
dp[i-1][j]+=max(dp[i][j],dp[i][j-1],dp[i][j+1]); //状态转移方程
cout<<dp[0][6]<<endl;
}
}