题解 P1541 【乌龟棋】
思路
dp,四维分别枚举用几张
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,IP,num[410],gs[5],dp[50][50][50][50],now;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>num[i];
}
for(int i=1;i<=m;i++)
{
cin>>IP;
gs[IP]++;
}
dp[0][0][0][0]=num[1];
for(int i1=0;i1<=gs[1];i1++)
{
for(int i2=0;i2<=gs[2];i2++)
{
for(int i3=0;i3<=gs[3];i3++)
{
for(int i4=0;i4<=gs[4];i4++)
{
now=1+i1+2*i2+3*i3+4*i4;
if(i1!=0)
dp[i1][i2][i3][i4]=max(dp[i1][i2][i3][i4],dp[i1-1][i2][i3][i4]+num[now]);
if(i2!=0)
dp[i1][i2][i3][i4]=max(dp[i1][i2][i3][i4],dp[i1][i2-1][i3][i4]+num[now]);
if(i3!=0)
dp[i1][i2][i3][i4]=max(dp[i1][i2][i3][i4],dp[i1][i2][i3-1][i4]+num[now]);
if(i4!=0)
dp[i1][i2][i3][i4]=max(dp[i1][i2][i3][i4],dp[i1][i2][i3][i4-1]+num[now]);
}
}
}
}
cout<<dp[gs[1]][gs[2]][gs[3]][gs[4]];
}