走格子拿分数,直接弄dp[i]是到了第i格的最大得分可以发现是假的。
于是此题设f[i][j][k][t]代表四种步伐各用了几次可以得到的最大得分,到达的点可以直接算出来,就好转移了。

const int maxn = 355;
int N, M;
int a[maxn], cnt[4];
int f[45][45][45][45], ans;

int main() {
	read(N), read(M);
	rep(i, 1, N)	read(a[i]);
	rep(i, 1, M) {
		int x; read(x);
		cnt[x - 1]++;
	}

	mset(f, -1);
	f[0][0][0][0] = a[1];
	rep(i, 0, cnt[0])
	rep(j, 0, cnt[1])
	rep(k, 0, cnt[2])
	rep(t, 0, cnt[3]) {
		int tmp = f[i][j][k][t], arr = i * 1 + j * 2 + k * 3 + t * 4 + 1;
		if (tmp < 0 || arr > N)	continue;
		if (arr == N) {
			ans = max(ans, tmp);
			continue;
		}
		if (i + 1 <= cnt[0] && arr + 1 <= N)	f[i + 1][j][k][t] = max(f[i + 1][j][k][t], tmp + a[arr + 1]);
		if (j + 1 <= cnt[1] && arr + 2 <= N)	f[i][j + 1][k][t] = max(f[i][j + 1][k][t], tmp + a[arr + 2]);
		if (k + 1 <= cnt[2] && arr + 3 <= N)	f[i][j][k + 1][t] = max(f[i][j][k + 1][t], tmp + a[arr + 3]);
		if (t + 1 <= cnt[3] && arr + 4 <= N)	f[i][j][k][t + 1] = max(f[i][j][k][t + 1], tmp + a[arr + 4]);
	}

	writeln(ans);
	return 0;
}