FZU 2092 记忆化搜索 || BFS

来源:互联网 发布:淘宝 发票 搜索什么 编辑:程序博客网 时间:2024/05/22 13:02

BFS:

#include "queue"#include "iostream"#include "algorithm"using namespace std;int dir[5][2]={1,0,-1,0,0,1,0,-1,0,0};int value[12][12][211];int hash[11][11][11][11][210];struct node{int time;__int64 value;friend bool operator<(node n1,node n2){if (n1.time==n2.time)return n2.value>n1.value;else return n2.time<n1.time;}int x1,x2,y1,y2;};int maxx,n,m;__int64 ans;char map[11][11];void bfs(){priority_queue<node>q;node cur,next;int i,j,l;cur.x1=cur.y1=cur.x2=cur.y2=0;cur.value=cur.time=0;hash[0][0][0][0][0]=1;q.push(cur);while (!q.empty()){cur=q.top();q.pop();for (i=0;i<5;i++)for (j=0;j<5;j++){next.x1=cur.x1+dir[i][0];next.y1=cur.y1+dir[i][1];next.x2=cur.x2+dir[j][0];next.y2=cur.y2+dir[j][1];next.time=cur.time+1;if (next.time>maxx) continue;if (next.x1<0 || next.x1>=n || next.y1<0 || next.y1>=m) continue;if (next.x2<0 || next.x2>=n || next.y2<0 || next.y2>=m) continue;if (hash[next.x1] [next.y1] [next.x2] [next.y2] [next.time]==1) continue;if (map[next.x1][next.y1]=='#' || map[next.x2][next.y2]=='#') continue;next.value=cur.value;if (next.x1==next.x2 && next.y1==next.y2) next.value+=value[next.x1][next.y1][next.time];else next.value+=value[next.x1][next.y1][next.time]+value[next.x2][next.y2][next.time];if (next.value>ans) ans=next.value;q.push(next);hash[next.x1] [next.y1] [next.x2] [next.y2] [next.time]=1;hash[next.x2] [next.y2] [next.x1] [next.y1] [next.time]=1;}}return ;}int main(){int i,Case,k,t,x,y;__int64 v;scanf("%d",&Case);while (Case--){scanf("%d%d",&n,&m);getchar();for (i=0;i<n;i++)gets(map[i]);scanf("%d",&k);memset(value,0,sizeof(value));maxx=0;for (i=1;i<=k;i++){scanf("%d%d%d%I64d",&t,&x,&y,&v);if (t>maxx) maxx=t;value[x-1][y-1][t]+=v;}ans=0;memset(hash,0,sizeof(hash));bfs();printf("%I64d\n",ans);}return 0;}


记忆化搜索:

#include "stdio.h"#include "string.h"#include "math.h"int dir[5][2]={1,0,-1,0,0,1,0,-1,0,0};int n,m;int dp[11][11][11][11][210];int value[12][12][210];char map[12][12];int dfs(int x1,int y1,int x2,int y2,int t){int x3,y3,x4,y4;int i,j,l,temp,max;if (t>200) return 0;    if (x1<0 || x1>=n || y1<0 || y1>=m) return 0;if (x2<0 || x2>=n || y2<0 || y2>=m) return 0;if (map[x1][y1]=='#' || map[x2][y2]=='#') return 0;if (dp[x1][y1][x2][y2][t]!=-1) return dp[x1][y1][x2][y2][t];temp=max=0;for (i=0;i<5;i++)for (j=0;j<5;j++){x3=x1+dir[i][0]; y3=y1+dir[i][1];x4=x2+dir[j][0]; y4=y2+dir[j][1];temp=dfs(x3,y3,x4,y4,t+1);if (temp>max) max=temp;}dp[x1][y1][x2][y2][t]=max;if (x1==x2 && y1==y2) dp[x1][y1][x2][y2][t]+=value[x1][y1][t];else dp[x1][y1][x2][y2][t]+=value[x1][y1][t]+value[x2][y2][t];return dp[x1][y1][x2][y2][t];}int main(){int i,Case,k,x,y,v,t;scanf("%d",&Case);while (Case--){scanf("%d%d",&n,&m);getchar();for (i=0;i<n;i++)gets(map[i]);scanf("%d",&k);memset(value,0,sizeof(value));while (k--){scanf("%d%d%d%d",&t,&x,&y,&v);value[x-1][y-1][t]+=v;}memset(dp,-1,sizeof(dp));printf("%d\n",dfs(0,0,0,0,0));}return 0;}



0 0