题意
n个格子中有一些分数,到达一个格子就可以拿到。初始在1,n为终点
有m张牌,保证用完刚好到达终点。牌有向前移动1,2,3,4格四种,求最高分数
题解
dp[j1][j2][j3][j4]表示用j1张‘1’牌,j2张‘2’牌,j3张‘3’牌,j4张‘4’牌能达到的最高分数
调试记录
判断j1 != 0要用if (j1),不是if (!j1)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[41][41][41][41], n, m, a[355], b[5];
int main(){
memset(b, 0, sizeof b);
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
for (int t, i = 1; i <= m; i++){
scanf("%d", &t); b[t]++;
}
memset(dp, 0, sizeof(dp));
dp[0][0][0][0] = a[1];
for (int j1 = 0; j1 <= b[1]; j1++){
for (int j2 = 0; j2 <= b[2]; j2++){
for (int j3 = 0; j3 <= b[3]; j3++){
for (int j4 = 0; j4 <= b[4]; j4++){
int tmp = 1 + j1 + j2 * 2 + j3 * 3 + j4 * 4;
if (j1) dp[j1][j2][j3][j4] = max(dp[j1][j2][j3][j4], dp[j1 - 1][j2][j3][j4] + a[tmp]);
if (j2) dp[j1][j2][j3][j4] = max(dp[j1][j2][j3][j4], dp[j1][j2 - 1][j3][j4] + a[tmp]);
if (j3) dp[j1][j2][j3][j4] = max(dp[j1][j2][j3][j4], dp[j1][j2][j3 - 1][j4] + a[tmp]);
if (j4) dp[j1][j2][j3][j4] = max(dp[j1][j2][j3][j4], dp[j1][j2][j3][j4 - 1] + a[tmp]);
}
}
}
}
printf("%d\n", dp[b[1]][b[2]][b[3]][b[4]]);
return 0;
}