FZU 2092 收集水晶 (记忆化搜索)

来源:互联网 发布:java菜单权限设计 编辑:程序博客网 时间:2024/05/22 17:36

题目链接
记录下dfs的参数状态,dfs表示在t时刻,一个在x1,y1,一个在x2,y2可以收集的最大的水晶数量

#include<cstdio>#include<cstring>#include<algorithm>#include<string>#include<vector>#include<queue>#include<iostream>using namespace std;#define LL __int64#define cl(a,b) memset(a,b,sizeof(a))#define pb push_backconst int maxn = 11;const int inf  = 1<<28;const __int64 mod = 1000000007;char a[15][15];int  val[205][15][15];int n,m;int dp[205][maxn][maxn][maxn][maxn];int check(int x,int y){    if(x<0||x>=n||y<0||y>=m||a[x][y]=='#')return false;    return true;}int dir[][2]={-1,0,0,-1,0,0,1,0,0,1};int MaxTime;int dfs(int tm,int x1,int y1,int x2,int y2){    if(tm>MaxTime)return 0;    if(dp[tm][x1][y1][x2][y2]!=-1)return dp[tm][x1][y1][x2][y2];    int &ans=dp[tm][x1][y1][x2][y2];    for(int i=0;i<5;i++){        int xx=dir[i][0]+x1;        int yy=dir[i][1]+y1;        if(check(xx,yy)==false)continue;        for(int j=0;j<5;j++){            int x=dir[j][0]+x2;            int y=dir[j][1]+y2;            if(check(x,y)==false)continue;            ans=max(ans,dfs(tm+1,xx,yy,x,y));        }    }    if(x1==x2&&y1==y2)ans+=val[tm][x1][y1];    else ans+=val[tm][x1][y1]+val[tm][x2][y2];    return ans;}int  main(){    int T;scanf("%d",&T);    while(T--){        scanf("%d%d",&n,&m);        for(int i=0;i<n;i++){            scanf("%s",a[i]);        }        int q;scanf("%d",&q);        cl(val,0);        MaxTime=0;        while(q--){            int t,x,y,v;scanf("%d%d%d%d",&t,&x,&y,&v);x--;y--;            val[t][x][y]+=v;            MaxTime=max(MaxTime,t);        }        cl(dp,-1);        printf("%d\n",dfs(0,0,0,0,0));    }    return 0;}
0 0
原创粉丝点击