比赛 防止颓废的小练习v0.4 评测结果 C
题目名称 方格取数 最终得分 0
用户昵称 ciyou 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2016-10-25 08:58:13
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int map[20][20],l,f[20][20],ans=0;

int pick(int x,int y);

int dfs(int x,int y,int now,int e){
    if(f[x][y]==e) map[x][y]=0;
    if(x<=0||x>l||y<=0||y>l){
        return 0;
    }
    if(x==l&&y==l){
        if(now>f[x][y]){
            f[x][y]=now;
            return now;
        }
    }
    int a=dfs(x+1,y,now+map[x][y],e);
    int b=dfs(x,y+1,now+map[x][y],e);
    if(a+b>0){
        f[x][y]=max(a,b);
        return f[x][y];
    }
    return 0;
}

void insert(int x,int y,int w){
    map[x][y]=map[2*l-x][2*l-y]=w;
    return;
}

int pick(int x,int y){
    int ret=map[x][y];
    map[x][y]=0;
    if(x<=l&&y<=l) map[2*l-x][2*l-y]=0;
    return ret;
}

int main(){
    freopen("fgqs.in","r",stdin);
    freopen("fgqs.out","w",stdout);
    scanf("%d",&l)
    memset(map,0,sizeof(map));
    memset(f,0,sizeof(f));
    int a,b;
    while(scanf("%d%d",&a,&b)&&a!=0&&b!=0){
        int temp;
        scanf("%d",&temp);
        insert(a,b,temp);
    }
    int e;
    int k=map[l][l];
    e=dfs(1,1,0,-1);
    f[l][l]=0;
    ans=e+dfs(1,1,0,e)+k;
    cout<<ans;
    fclose(stdin);
    fclose(stdout);
    return 0;
}