forwhat00  
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<vector>
#include<algorithm>
#define DEBUG if(0)//方便测试
#define MAX 100010
using namespace std;
int N;
int map[2][MAX][15];
int f(int x,int y){
    if(x<max(0,5-y) || x>min(10,y+5) || y<0)return 0;//超出可拾取范围
    if(map[1][y][x]>=0)return map[1][y][x]; //已经计算过
    map[1][y][x]=max(f(x-1,y-1),max(f(x,y-1),f(x+1,y-1)));//从上方找出最大值
    return map[1][y][x]+=map[0][y][x];//加上当前项
}
int main(){
    while(cin>>N,N>0){
        int a=0,b=0,maxt=0;
        memset(map[0],0,sizeof(map[0]));
        memset(map[1],-1,sizeof(map[1]));
        for(int i=0;i<N;i++){
            scanf("%d%d",&a,&b);

            map[0][b][a]++;//该位置可以拾取到一个
            if(maxt<b)maxt=b;//记录总时间
        }
        
        DEBUG cout<<maxt<<endl;
        DEBUG{
            for(int i=0;i<=maxt;i++){
                for(int j=0;j<=10;j++){
                    cout<<map[0][i][j]<<" ";
                }//输出记录的地图
                cout<<endl;
            }
        }
        
        int maxans=0;
        for(int i=0;i<=10;i++){
            if(maxans<f(i,maxt))//从计算出的表最下方找出最大的
                maxans=f(i,maxt);
        }
        DEBUG{cout<<endl;;
            for(int i=0;i<=maxt;i++){
                for(int j=0;j<=10;j++){
                    if(map[1][i][j]>=0)//输出表
                        cout<<map[1][i][j]<<" ";
                    else 
                        cout<<"#"<<" ";//好看!
                }
                cout<<endl;
            }
        }
        cout<<maxans<<endl;

    };

    return 0;
}

https://vjudge.net/contest/382410#problem/D

posted on 2020-07-15 00:48  forwhat00  阅读(146)  评论(0编辑  收藏  举报