【洛谷P1541】乌龟棋

时间:2023-03-10 07:23:49
【洛谷P1541】乌龟棋

四维dp

 #include<cstdio>
#include<cstring>
using namespace std;
const int N=;
int f[N][N][N][N],g[],a,b,c,d,n,m;
int max(int x,int y){
return x>y?x:y;
}
int main(){
int tmp;
a=b=c=d=;
scanf("%d %d",&n,&m);
for (int i=;i<=n;i++)
scanf("%d",&g[i]);
for (int i=;i<=m;i++){
scanf("%d",&tmp);
if (tmp==) a++;
if (tmp==) b++;
if (tmp==) c++;
if (tmp==) d++;
}
f[][][][]=g[];
for (int i=;i<=a;i++)
for (int j=;j<=b;j++)
for (int k=;k<=c;k++)
for (int l=;l<=d;l++){
tmp=+i+j*+k*+l*;//**
if (i->=)
f[i][j][k][l]=max(f[i-][j][k][l]+g[tmp],f[i][j][k][l]);
if (j->=)
f[i][j][k][l]=max(f[i][j-][k][l]+g[tmp],f[i][j][k][l]);
if (k->=)
f[i][j][k][l]=max(f[i][j][k-][l]+g[tmp],f[i][j][k][l]);
if (l->=)
f[i][j][k][l]=max(f[i][j][k][l-]+g[tmp],f[i][j][k][l]);
}
printf("%d",f[a][b][c][d]);
return ;
}

STD