滾動數組
//圖論?因爲只有四種顏色,因此,一個點連四條邊
//數據保證到達終點時剛好用光 MM 張爬行卡片。??這就比較麻煩了
//回憶之前做過的搜索題
//f[i][j],j表示已經用了幾張牌了
//表示每張牌還有幾張f[][p][q][u][v]
//begin
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,a[352],b,f[5][41][41][41][41];///////////空間超了。。
int p,q,u,v;
int main()
{
// freopen("tortoise8.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int j=1;j<=m;j++)
{
scanf("%d",&b);
if(b==1)
p++;
else if(b==2)
q++;
else if(b==3)
u++;
else
v++;
}
memset(f,0x80,sizeof f);
f[1][v][u][q][p]=a[1];
// cout<<v<<","<<u<<","<<q<<","<<p<<endl;
//滾動數組 ,那結果是什麼呢?
for(int i=2;i<=n;i++)
for(int vi=v;vi>=0;vi--)
for(int ui=u;ui>=0;ui--)
for(int qi=q;qi>=0;qi--)
for(int pi=p;pi>=0;pi--)
{
if(i-4>=1 && vi+1<=v)
f[i%5][vi][ui][qi][pi]=max(f[i%5][vi][ui][qi][pi],f[(i-4)%5][vi+1][ui][qi][pi]+a[i]);
if(i-3>=1 && ui+1<=u)
f[i%5][vi][ui][qi][pi]=max(f[i%5][vi][ui][qi][pi],f[(i-3)%5][vi][ui+1][qi][pi]+a[i]);
if(i-2>=1 && qi+1<=q)
f[i%5][vi][ui][qi][pi]=max(f[i%5][vi][ui][qi][pi],f[(i-2)%5][vi][ui][qi+1][pi]+a[i]);
if(i-1>=1 && pi+1<=p)
f[i%5][vi][ui][qi][pi]=max(f[i%5][vi][ui][qi][pi],f[(i-1)%5][vi][ui][qi][pi+1]+a[i]);
// cout<<i<<","<<vi<<","<<ui<<","<<qi<<","<<pi<<","<<f[i%5][vi][ui][qi][pi]<<endl;
} //f[2][0][1][1][0]
cout<<f[n%5][0][0][0][0]<<endl;
}
//圖論?因爲只有四種顏色,因此,一個點連四條邊
//數據保證到達終點時剛好用光 MM 張爬行卡片。??這就比較麻煩了
//回憶之前做過的搜索題
//f[i][j],j表示已經用了幾張牌了
//表示每張牌還有幾張f[][p][q][u][v]
//begin
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,a[352],b,f[41][41][41][41];///////////空間超了。。
int p,q,u,v;
int main()
{
// freopen("tortoise10.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int j=1;j<=m;j++)
{
scanf("%d",&b);
if(b==1)
p++;
else if(b==2)
q++;
else if(b==3)
u++;
else
v++;
}
memset(f,0x80,sizeof f);
f[v][u][q][p]=a[1];
// cout<<v<<","<<u<<","<<q<<","<<p<<endl;
//滾動數組 ,那結果是什麼呢?
// for(int i=2;i<=n;i++)
for(int vi=v;vi>=0;vi--)
{
for(int ui=u;ui>=0;ui--)
{
for(int qi=q;qi>=0;qi--)
{
for(int pi=p;pi>=0;pi--)
{
int i=(v-vi)*4+(u-ui)*3+(q-qi)*2+(p-pi)*1+1;
if(vi+1<=v)
f[vi][ui][qi][pi]=max(f[vi][ui][qi][pi],f[vi+1][ui][qi][pi]+a[i]);
if( ui+1<=u)
f[vi][ui][qi][pi]=max(f[vi][ui][qi][pi],f[vi][ui+1][qi][pi]+a[i]);
if( qi+1<=q)
f[vi][ui][qi][pi]=max(f[vi][ui][qi][pi],f[vi][ui][qi+1][pi]+a[i]);
if(pi+1<=p)
f[vi][ui][qi][pi]=max(f[vi][ui][qi][pi],f[vi][ui][qi][pi+1]+a[i]);
// cout<<i<<","<<vi<<","<<ui<<","<<qi<<","<<pi<<","<<f[vi][ui][qi][pi]<<endl;
} //f[2][0][1][1][0]
}
}
}
cout<<f[0][0][0][0]<<endl;
}