为了使问题简化,假设在接下来的一段时间里,馅饼都掉落在0-10这11个位置。开始时gameboy站在5这个位置,因此在第一秒,他只能接到4,5,6这三个位置中其中一个位置上的馅饼。问gameboy最多可能接到多少个馅饼?(假设他的背包可以容纳无穷多个馅饼)
Output每一组输入数据对应一行输出。输出一个整数m,表示gameboy最多可能接到m个馅饼。
提示:本题的输入数据量比较大,建议用scanf读入,用cin可能会超时。
Sample Input
6 5 1 4 1 6 1 7 2 7 2 8 3 0Sample Output
4
水一水简单的dp。。。
思路:
dp[i][j]表示在i时刻j位置能接到馅饼的最大数,采用从后往前搜,最后输出dp[0][5]即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <algorithm>
#include <vector>
#include <stack>
#define INF 0x3f3f3f3f
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
const int maxn=100005;
int dp[maxn][11];
int num[maxn][11];
int n;
int main()
{
while(~scanf("%d",&n)&&n)
{
memset(dp, 0, sizeof(dp));
memset(num, 0, sizeof(num));
int maxt=0;
for(int i=0; i<n; i++)
{
int t, pos;
scanf("%d%d", &pos, &t);
maxt=max(maxt, t);
num[t][pos]++; //注意同一时刻的同一位置可能掉多个馅饼
}
for(int i=maxt; i>=0; i--)
{
for(int j=0; j<=10; j++)
{
if(j==0)
{
dp[i][j]=max(dp[i][j], dp[i+1][j]);
dp[i][j]=max(dp[i][j], dp[i+1][j+1]);
}
else
if(j==10)
{
dp[i][j]=max(dp[i][j], dp[i+1][j-1]);
dp[i][j]=max(dp[i][j], dp[i+1][j]);
}
else
{
dp[i][j]=max(dp[i][j], dp[i+1][j-1]);
dp[i][j]=max(dp[i][j], dp[i+1][j]);
dp[i][j]=max(dp[i][j], dp[i+1][j+1]);
}
dp[i][j]+=num[i][j];
}
}
printf("%d\n", dp[0][5]);
}
return 0;
}