zoukankan      html  css  js  c++  java
  • HDU 1176 免费馅饼

    思路:这道题是数塔模型的一种变形

    首先,我们会看到,随着时间的不同,落下馅饼的位置也会不同,那么我们会考虑到,我们想到第i个点去接馅饼时候,会发现这时我们拥有的馅饼数量是(即状态转移方程):

    dp[当前时间][当前位置]+=dp[当前时间-1][上一个位置(细致思考会发现有3个位置)]

    所以AC代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int N = 100005;
    int dp[N][12];
    int main()
    {
      int n,t,x,maxx,m;
      while(~scanf("%d",&n))
      {
         if(n==0)break;
         m=n;
         maxx=0;
         memset(dp,0,sizeof(dp));
         while(m--)
         {
           scanf("%d%d",&x,&t);
           dp[t][x] ++;
           if(maxx<t)maxx=t;      //优化层次
         }
         for(int i=maxx-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(max(dp[i+1][j-1],dp[i+1][j]),dp[i+1][j+1]);     //3个上一状态的最大值
         }
    
         printf("%d
    ",dp[0][5]);                //顶点
      }
      return 0;
    }



  • 相关阅读:
    接口内容小结
    接口的静态方法与私有方法
    接口的默认方法
    发红包O
    抽象
    《大道至简》读后感
    重写
    继承中的二义性问题
    数学应用
    继承
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3959678.html
Copyright © 2011-2022 走看看