[暑假集训]开训复健练习赛 D - 免费馅饼

#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

你可能感兴趣的:([暑假集训]开训复健练习赛 D - 免费馅饼)