免费馅饼
HDU - 1176
这也是一道比较简单的动态规划
dp[i][j]表示到时间i,位置为j所能采集的最大馅饼数量
状态转移非常好写
dp[i][j] = max{dp[i-1][j],dp[i-1][j-1],dp[i-1][j+1]} + T[j][i]
其中T[j][i]表示的是时间为i,位置为j落下的馅饼的数量
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX = 100000;
const int INF = 1e9;
int dp[MAX][14];
int T[14][MAX];
int main(){int n;while(~scanf("%d",&n) && n){for(int i = 0;i < MAX;i++){for(int j = 0;j <= 10;j++){dp[i][j] = -INF;}}memset(T,0,sizeof(T));int mx = 0;for(int i = 0;i < n;i++){int a,b;scanf("%d%d",&a,&b);T[a][b] ++;mx = max(mx,b);}dp[0][5] = 0;for(int i = 1;i <= mx;i++){for(int j = 0;j <= 10;j++){dp[i][j] = max(dp[i][j],dp[i-1][j-1] + T[j][i]);dp[i][j] = max(dp[i][j],dp[i-1][j] + T[j][i]);dp[i][j] = max(dp[i][j],dp[i-1][j+1] + T[j][i]);}}int ans = 0;for(int i = 0;i <= 10;i++){ans = max(ans,dp[mx][i]);}printf("%d\n",ans);}return 0;
}