zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    [C#][控件]WebBrowser 使用范例
    [java]经验集
    [html][easyui]DataGrid 绑定
    [转]jQuery 读取 xml
    [转][html]大文件下载
    [转][javascript]判断传入参数
    [html][javascript] Cookie
    [bat]批处理删默认共享和清理垃圾
    [转]JavaScript RegExp 对象参考手册
    5个编程问题(1小时解决)
  • 原文地址:https://www.cnblogs.com/dowson/p/3281631.html
Copyright © 2011-2022 走看看