[夏休み合宿]リハビリ練習試合D-無料パイ

7218 ワード

#include
#include
#include
#include
#include
#define DEBUG if(0)// 
#define MAX 100010
using namespace std;
int N;
int map[2][MAX][15];
int f(int x,int y){
    if(x0,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){
            scanf("%d%d",&a,&b);

            map[0][b][a]++;// 
            if(maxt// 
        }
        
        DEBUG cout<endl;
        DEBUG{
            for(int i=0;i<=maxt;i++){
                for(int j=0;j<=10;j++){
                    cout<0][i][j]<<" ";
                }// 
                cout<<endl;
            }
        }
        
        int maxans=0;
        for(int i=0;i<=10;i++){
            if(maxans// 
                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<1][i][j]<<" ";
                    else 
                        cout<<"#"<<" ";//
                }
                cout<<endl;
            }
        }
        cout<endl;

    };

    return 0;
}

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