HDU 1176 - 免费馅饼

知识点:1、数塔;

                2、整数(int 型)输入外挂(可大大缩短数据输入的时间,对于数据庞大的题目效果显著)。

#include <cstdio>
#include <memory.h>

//整数输入外挂,减少时间
bool scan_d(int &n)    
{
    char i;
    bool I=0;
    i=getchar();
    if(i==EOF) return 0;
    while(i!='-'&&(i<'0'||i>'9'))
    i=getchar();
    if(i=='-') I=1,n=0;
    else n=i-'0';
    while(i=getchar(),i>='0'&&i<='9')
    n=n*10+i-'0';
    if(I) n=-n;
    return 1;
}

//以时间和位置建立二维dp数组,第一维表示时间,第二维表示位置
int dp[100001][11];    

int main()
{
    int n;
    while(scan_d(n),n)
    {
        memset(dp,0,sizeof(dp));
        int x,t,max_t=0;
        while(n--)
        {
            scan_d(x);    //整数输入外挂函数调用
            scan_d(t);
            dp[t][x]++;    //用输入数据初始化dp数组
            if(max_t<t) max_t=t;
        }

        //对数塔dp进行处理
        for(int i=max_t-1;i>=0;i--)    
        for(int j=0;j<=10;j++)
        {
            //状态转移方程:dp[i][j]+=max(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1])
            int tmp=dp[i+1][j];
            //考虑 j==0 和 j==10 时的特殊情况    
            if(j&&tmp<dp[i+1][j-1]) tmp=dp[i+1][j-1];    
            if(j<10&&tmp<dp[i+1][j+1]) tmp=dp[i+1][j+1];
            dp[i][j]+=tmp;
        }

        printf("%d\n",dp[0][5]);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值