hdu1176免费馅饼

代码有点长,不过ACCEPT了

创新点是输入时,用set数组来表示第t秒x个位置上下了一个饼

看了人家给得特殊例子,发现一个问题,当第i秒没有饼下来,或者第i秒饼下的位置人没有走到,这两种特殊情况,所以就加了以下的几行代码

if(set[i][j-1]!=0&&j-1>=0)dp[i][j-1]=max(dp[i][j-1],dp[i-1][j]+set[i][j-1]);
if(set[i][j]!=0)dp[i][j]=max(dp[i][j],dp[i-1][j]+set[i][j]);
if(set[i][j+1]!=0&&j+1<=10)dp[i][j+1]=max(dp[i][j+1],dp[i-1][j]+set[i][j+1]);
if(set[i][j-1]==0&&j-1>=0)dp[i][j-1]=max(dp[i][j-1],dp[i-1][j]+set[i][j-1]);
if(set[i][j]==0)dp[i][j]=max(dp[i][j],dp[i-1][j]+set[i][j]);
if(set[i][j+1]==0&&j+1<=10)dp[i][j+1]=max(dp[i][j+1],dp[i-1][j]+set[i][j+1]);

#include "iostream"
#include "string.h"
using namespace std;
int max(int a,int b){return a>b?a:b;}
int set[100010][12],dp[100010][16];

int main(){
  int n,time,maxb,i,x,t,j;
  while(cin>>n){
    if(!n)break;
    time=0;maxb=0;
    memset(set,0,sizeof(set));
    for(i=1;i<=n;i++){cin>>x>>t;set[t][x]++;time=max(time,t);}
    for(i=0;i<=time;i++){
      for(j=0;j<=10;j++)
      dp[i][j]=0;
    }
    dp[0][5]=1;
    for(i=1;i<=time;i++){
      for(j=0;j<=10;j++){
        if(dp[i-1][j]){
          if(set[i][j-1]!=0&&j-1>=0)dp[i][j-1]=max(dp[i][j-1],dp[i-1][j]+set[i][j-1]);
          if(set[i][j]!=0)dp[i][j]=max(dp[i][j],dp[i-1][j]+set[i][j]);
          if(set[i][j+1]!=0&&j+1<=10)dp[i][j+1]=max(dp[i][j+1],dp[i-1][j]+set[i][j+1]);
          if(set[i][j-1]==0&&j-1>=0)dp[i][j-1]=max(dp[i][j-1],dp[i-1][j]+set[i][j-1]);
          if(set[i][j]==0)dp[i][j]=max(dp[i][j],dp[i-1][j]+set[i][j]);
          if(set[i][j+1]==0&&j+1<=10)dp[i][j+1]=max(dp[i][j+1],dp[i-1][j]+set[i][j+1]);
        }
      }
      //for(j=0;j<=10;j++)cout<<dp[i][j]<<' ';cout<<endl;
    }
    for(i=0;i<=10;i++){maxb=max(maxb,dp[time][i]);}
    if(maxb==0)cout<<0<<endl;
    else cout<<maxb-1<<endl;
  }
}

看看人家网上的答案,才知道,自己的重要部分的代码真的挺长的,大神说这是数塔的变型,而且他跟我的一个不同点是,我从0 5走到最后,他是从最后往回走,走到0 5

看看大神的代码吧

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int max3(int a,int b,int c)
{
    a = a>b?a:b;
    a = a>c?a:c;
    return a;
}
int max2(int a,int b)
{
    a = a>b?a:b;
    return a;
}
int t[100001][11];
int main()
{
    int n,T,x,max;
    while(scanf("%d",&n)&&n)
    {
        memset(t,0,sizeof(t));
        max = 0;
        while(n--)
        {
            scanf("%d %d",&x,&T);
            t[T][x]++;
            max = max>T?max:T;
        }
        for(int i = max-1; i >= 0; i--)
        {
            for(int j = 0; j <= 10; j++)
            {
                if(j==0)t[i][j] += max2(t[i+1][j],t[i+1][j+1]);
                else if(j==10) t[i][j] += max2(t[i+1][j],t[i+1][j-1]);
                else t[i][j] += max3(t[i+1][j-1],t[i+1][j],t[i+1][j+1]);
            }
        }
        cout<<t[0][5]<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/dowson/p/3281631.html