知道用动规,可是用一维数组表示不起,就改成深搜了。考完后上网没想到要用四维数组。
z,y,k,x为四张卡片的数量把ha[z][y][k][x]与ha[z-1][y][k][x],ha[z][y-1][k][x],ha[z][y][k-1][x],ha[z][y][k][x-1]比较再加上地图值
#include<bits/stdc++.h>
using namespace std;
int k,m,n,ha[41][41][41][41],q[1000],kao[1000];
using namespace std;
int main(){
scanf("%d%d",&n,&m);
for(int z=0;z<n;++z) scanf("%d",&q[z]);
for(int z=1;z<=m;++z){
int a;
scanf("%d",&a);
++kao[a];
}
for(int z=0;z<=kao[1];++z)
for(int y=0;y<=kao[2];++y)
for(int k=0;k<=kao[3];++k)
for(int x=0;x<=kao[4];++x){
if(z)ha[z][y][k][x]=max(ha[z][y][k][x],ha[z-1][y][k][x]);
if(y)ha[z][y][k][x]=max(ha[z][y][k][x],ha[z][y-1][k][x]);
if(k)ha[z][y][k][x]=max(ha[z][y][k][x],ha[z][y][k-1][x]);
if(x)ha[z][y][k][x]=max(ha[z][y][k][x],ha[z][y][k][x-1]);
ha[z][y][k][x]+=q[z+y*2+k*3+x*4];
}
printf("%d",ha[kao[1]][kao[2]][kao[3]][kao[4]]);
return 0;
}