在已经知道用动态规划来做这题的前提下,首先用dp[i][j]来记录第 i 秒时在 j 点能接到的最多馅饼数。
那么dp[i][j]= 当前在 j 位置掉落的馅饼数 + 下一秒秒时在 j、j+1、j-1这三个位置能接到的馅饼数的最大值
用save[i][j]来记录第 i 秒时在第 j 个位置会凋落的馅饼数
dp[ i ][ j ]=max(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1])+save[i][j]
一定要记住题目问的是第0秒的状态。。。。。。。
下面是代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <cmath> #include <cstdlib> #include <ctime> #include <stack> using namespace std; const int maxn = 100005; int dp[maxn][12]; int save[maxn][12]; int main(){ int n,i,j,x,t; while(scanf("%d",&n)&&n){ memset(dp, 0, sizeof(dp)); memset(save, 0, sizeof(save)); int maxtime=0; for(i=1;i<=n;i++){ scanf("%d%d",&x,&t); maxtime=max(maxtime,t); save[t][x]++; } for(i=maxtime;i>=0;i--){ for(j=0;j<=10;j++){ int left = dp[i+1][j-1]; int middle = max(dp[i+1][j],left); int right = max(dp[i+1][j+1],middle); dp[i][j] = save[i][j]+right; } } printf("%d\n",dp[0][5]); } return 0; }
