题目大意
初始有四种卡片,消耗后分别可以前进 、、 和 格。棋盘上每个点都有个分数,求从第 格到达第 格途径分数的最大值。
分析
设状态 为使用 张前进 、……、 张前进 之后的状态,容易得到转移方程
处理一下边界情况,滚动数组即可。
ll dp[50][50][50], aa[400], tt[10];
int main() {
ll n = rr(), m = rr();
for (ll i = 1; i <= n; i++) {
aa[i] = rr();
}
for (ll i = 1; i <= m; i++) {
tt[rr()]++;
}
for (ll i = 0; i <= tt[1]; i++) {
for (ll j = 0; j <= tt[2]; j++) {
for (ll k = 0; k <= tt[3]; k++) {
for (ll w = 0; w <= tt[4]; w++) {
dp[j][k][w] = aa[i * 1 + j * 2 + k * 3 + w * 4 + 1] + max4(
j == 0 ? 0 : dp[j - 1][k][w],
k == 0 ? 0 : dp[j][k - 1][w],
w == 0 ? 0 : dp[j][k][w - 1],
dp[j][k][w]);
}
}
}
}
printf("%lld\n", dp[tt[2]][tt[3]][tt[4]]);
return 0;
}