luogu1541题解 记忆化搜索

来源:互联网 发布:算法导论中文版pdf 编辑:程序博客网 时间:2024/06/04 01:34

记忆化搜索,dfs形式的dp

从最后一个点向前f[位置][第一种卡][第二种卡][第三种卡]

本来用dp过了,突发奇想这么写,大佬不要吐槽时空的浪费

```

#include<iostream>#include<cstdio>usingnamespacestd;int n,m,a[360],l[6],f[360][41][41][41];intMAX(int x,int y,int z,int c){ x=max(x,y); z=max(z,c); return max(x,z);}intdfs(int e,int x,int y,int z,int c,int aa,int bb,int cc,int dd){ aa=bb=cc=dd=0;//发现这四个变量不用递归形式会乱,就定义在递归里if(f[e][x][y][z]!=0)return f[e][x][y][z]; if(e-1>0&&x-1>=0){ aa=dfs(e-1,x-1,y,z,c,0,0,0,0)+a[e]; } if(e-2>0&&y-1>=0){ bb=dfs(e-2,x,y-1,z,c,0,0,0,0)+a[e]; } if(e-3>0&&z-1>=0){ cc=dfs(e-3,x,y,z-1,c,0,0,0,0)+a[e]; } if(e-4>0&&c-1>=0){ dd=dfs(e-4,x,y,z,c-1,0,0,0,0)+a[e]; } f[e][x][y][z]=MAX(aa,bb,cc,dd); return f[e][x][y][z];}intmain(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&a[i]); } for(int i=1;i<=m;i++){scanf("%d",&l[0]); l[l[0]]++; } f[1][0][0][0]=a[1];printf("%d\n",dfs(n,l[1],l[2],l[3],l[4],0,0,0,0));return0;}

```

原创粉丝点击