免费馅饼
题意
给n个馅饼,每个馅饼在t时刻掉落在p位置(0 <= p <= 10),起初在x=5位置上,每秒只能移动一格,问最终能接多少个馅饼
分析
定义:dp[t][p]:t 秒在位置p可以最多接的饼数
转移:相邻或者自己的位置转移过来,注意边界初始化
#include <bits/stdc++.h> #define ll long long using namespace std; const int maxn = 1e5+5; int a[maxn][11]; int n; int dp[maxn][11]; int main() { while(scanf("%d", &n)!=EOF) { memset(a, 0 ,sizeof(a)); if(n==0) break; int p,t; int maxx = 0; while(n--) { scanf("%d%d", &p, &t); a[t][p]++; maxx = max(maxx, t); } for(int i = 0; i <= maxx; i++) { for(int j = 0; j <= 10; j++) dp[i][j] = -1e9; } dp[0][5] = 0; for(int i = 1; i <= maxx; i++) { for(int j = 0; j <= 10; j++) { if(j==0) { dp[i][j]=max(dp[i-1][j], dp[i-1][j+1])+a[i][j]; } else if(j==10) { dp[i][j]=max(dp[i-1][j], dp[i-1][j-1])+a[i][j]; } else { dp[i][j] = max(dp[i-1][j], max(dp[i-1][j-1], dp[i-1][j+1]))+a[i][j]; } } } int maxsum = 0; for(int j = 0; j <= 10; j++) { maxsum = max(dp[maxx][j],maxsum); } printf("%d ", maxsum); } return 0; }