传送门
题意:有0-10共十一个点,最开始的时候位于5这个位置,他每一秒只能向左或者右移动一个位置,求他最大能够接到多少个馅饼。
开一个二维dp数组,dp[i][j]表示在弟i秒的时候,在j位置最多能够接到的最大馅饼的数量,所以这里状态转换方程就是dp[i][j]+=max(dp[i-1][j],max(dp[i-1][j-1],dp[i-1][j+1]));这里我们要考虑一下j0和j10的情况就行了
#include <iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<string>
#include<queue>
#define lson l, mid, root << 1
#define rson mid + 1, r, root << 1 | 1
#define ftr l , r , root
#define lowbit(x) ( x & ( - x ) )
#define mod 1000000007
#define ll long long
using namespace std;
const int maxn = 1e5+10;
const int inf = 0x3f3f3f3f;
int dp[maxn][15];
int main()
{
int n;
while(scanf("%d",&n),n){
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++){
int w,t;
scanf("%d%d",&w,&t);
if(t!=1||w==5||w==4||w==6)
dp[t][w]++;
}
for(int i=2;i<maxn;i++){
for(int j=0;j<=10;j++){
if(j==0){
dp[i][j]+=max(dp[i-1][j],dp[i-1][j+1]);
}else if(j==10){
dp[i][j]+=max(dp[i-1][j],dp[i-1][j-1]);
}else{
dp[i][j]+=max(dp[i-1][j],max(dp[i-1][j-1],dp[i-1][j+1]));
}
}
}
int ans=0;
for(int i=0;i<=10;i++){
ans=max(ans,dp[maxn-1][i]);
}
printf("%d\n",ans);
}
return 0;
}