hdu 1176 dp 数塔问题

Posted iEdson

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 1176 dp 数塔问题相关的知识,希望对你有一定的参考价值。

哎,一开始没看到从5开始....

后来写懵了,用了queue正推,记录能到达的节点,p[i+1][j] = max(p[i][j],max(p[i][j-1],p[i][j+1])) 

嗯,用stl mle了,自己写queue又tle,不知道为什么嚒,好像bfs我从没a过...

看了dicuss的思路,只看到数塔两个字我就懂了...

只能说巧妙了,区间反向确定我确实没想到...

技术分享
//数塔问题
/*
    t=0       5
    t=1      456
    t=2     34567
    t=3    2345678
    t=4   123456789
    t=5  0123456789A
*/

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

const int MAXN= 1e5+10;

using namespace std;

int dp[MAXN][12];
int mov[3]={-1,0,1};

/*bool isOverBorder(int x){
    if(x<0||x>10)return true;
    else return false;
}*/

void init(){
    for(int i=0;i<MAXN;i++){
        for(int j=0;j<11;j++){
            dp[i][j] = 0;
        }
    }
}

int main()
{
    int n;
    while(scanf("%d",&n),n){
        int t,p;
        int maxt = -MAXN;
        init();
        for(int i=0;i<n;i++){
            scanf("%d%d",&p,&t);
            dp[t][p] += 1;
            maxt = max(maxt,t);
        }

        for(int i=maxt-1;i>=0;i--){
            dp[i][0] += max(dp[i+1][0],dp[i+1][1]);
            for(int j=1;j<11;j++){
                dp[i][j] += max(dp[i+1][j],max(dp[i+1][j+1],dp[i+1][j-1]));
            }
        }
        cout<<dp[0][5]<<endl;
    }
    return 0;
}
View Code

 

以上是关于hdu 1176 dp 数塔问题的主要内容,如果未能解决你的问题,请参考以下文章

hdoj1176 免费馅饼(dp 数塔)

HDU 1176 免费馅饼

hdu-1176(动态规划)

hdu 1176

HDU 1176 免费馅饼 (动态规划另类数塔)

HDU 1176