这道题可以用多维dp(4维,每一维代表一种卡片)或者记忆化搜索解决,这里奉上dp的解法,其中的状态转移方程可以推出为:
//i,j,k,l分别代表步长为1,2,3,4
int value = 1;//因为乌龟初始位置为1的格子
value += i*1 + j*2 + k*3 + l*4;
//value代表当前走到的位置
if(i > 0)
dp[i][j][k][l] = max(dp[i - 1][j][k][l] + a[value], dp[i][j][k][l]);
if(j > 0)
dp[i][j][k][l] = max(dp[i][j - 1][k][l] + a[value], dp[i][j][k][l]);
if(k > 0)
dp[i][j][k][l] = max(dp[i][j][k - 1][l] + a[value], dp[i][j][k][l]);
if(l > 0)
dp[i][j][k][l] = max(dp[i][j][k][l - 1] + a[value], dp[i][j][k][l]);
代码如下:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
#define IOS ios::sync_with_stdio(false);
typedef pair<int, int> PII;
typedef long long ll;
const int N = 500;
int dp[50][50][50][50];
int a[N];
int n, m;
int num[5];
int main()
{
IOS;
cin.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
for (int i = 1; i <= m; i++)
{
int k;
cin >> k;
switch (k)
{
case 1:
num[1]++;
break;
case 2:
num[2]++;
break;
case 3:
num[3]++;
break;
case 4:
num[4]++;
break;
default:
break;
}
}
dp[0][0][0][0] = a[1];
for (int i = 0; i <= num[1]; i++)
{
for (int j = 0; j <= num[2]; j++)
{
for (int k = 0; k <= num[3]; k++)
{
for (int l = 0; l <= num[4]; l++)
{
int value = 1;
value += i + j * 2 + k * 3 + l * 4;
if (i > 0)
{
dp[i][j][k][l] = max(dp[i - 1][j][k][l] + a[value], dp[i][j][k][l]);
}
if (j > 0)
{
dp[i][j][k][l] = max(dp[i][j - 1][k][l] + a[value], dp[i][j][k][l]);
}
if (k > 0)
{
dp[i][j][k][l] = max(dp[i][j][k - 1][l] + a[value], dp[i][j][k][l]);
}
if (l > 0)
{
dp[i][j][k][l] = max(dp[i][j][k][l - 1] + a[value], dp[i][j][k][l]);
}
}
}
}
}
cout << dp[num[1]][num[2]][num[3]][num[4]] << endl;
system("pause");
return 0;
}