HDU1176

免费馅饼

题意

给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;
}
View Code
要么优秀要么生锈
原文地址:https://www.cnblogs.com/Superwalker/p/7878390.html