dp[i][j]代表i时刻j位置最多的馅饼数量初始时只有dp[1][4],dp[1][5],dp[1][6]有值,转移方程为:
dp[i][j] = max(dp[i][j],dp[i - 1][j] + cnt[i][j]);
if(j - 1 >= 0)
dp[i][j] = max(dp[i][j],dp[i - 1][j - 1] + cnt[i][j]);
if(j + 1 <= 10)
dp[i][j] = max(dp[i][j],dp[i - 1][j + 1] + cnt[i][j]);
AC代码:
#include<bits/stdc++.h>
#define pb push_back
#define se second
#define fi first
#define mp make_pair
using namespace std;
const int N = 1e5 + 5;
typedef long long ll;
ll dp[N][11],ans;
int cnt[N][11];
int n,x,T,maxT;
vector<pair<int,int > > v;
int main(){
while(scanf("%d",&n)){
if(n == 0)break;
maxT = 0,ans = 0;
v.clear();
for(int i = 0;i < n;i++){
scanf("%d%d",&x,&T);
maxT = max(maxT,T);
v.pb(mp(x,T));
}
for(int i = 1;i <= maxT;i++){
for(int j = 0;j <= 10;j++)
dp[i][j] = 0,cnt[i][j] = 0;
}
for(int i = 0;i < n;i++)
cnt[v[i].se][v[i].fi]++;
dp[1][4] = cnt[1][4],dp[1][5] = cnt[1][5],dp[1][6] = cnt[1][6];
ans = max(dp[1][4],max(dp[1][5],dp[1][6]));
for(int i = 2;i <= maxT;i++){
for(int j = 0;j <= 10;j++){
dp[i][j] = max(dp[i][j],dp[i - 1][j] + cnt[i][j]);
if(j - 1 >= 0)
dp[i][j] = max(dp[i][j],dp[i - 1][j - 1] + cnt[i][j]);
if(j + 1 <= 10)
dp[i][j] = max(dp[i][j],dp[i - 1][j + 1] + cnt[i][j]);
ans = max(ans,dp[i][j]);
}
}
printf("%lld\n",ans);
}
return 0;
}