洛谷1541
题目的成败在于能否写出转移方程
我们用dp[i][j][k][z]表示分别用了i j k z 张 1 2 3 4后得到的最高分
使用完i j k z 张1 2 3 4后走到的格子P是确定的,分数也是确定的
我们就要找出之前的最高分
而我们走到P时出的最后一张牌是不知道的
所以就分别枚举4种情况(因为只有4张牌)
选择最大的一种即可
#include <bits/stdc++.h>
using namespace std;
int dp[50][50][50][50];
int a[355];
int co[10];
int n,m;
int main()
{
cin >> n >> m;
for(int i=0;i<n;i++)
{
cin >> a[i];
}
int x;
for(int i=1;i<=m;i++)
{
cin >> x;
co[x]++;
}
dp[0][0][0][0]=a[0];
for(int i=0;i<=co[1];i++)
{
for(int j=0;j<=co[2];j++)
{
for(int k=0;k<=co[3];k++)
{
for(int z=0;z<=co[4];z++)
{
int t=i+j*2+k*3+z*4;
if(i)
dp[i][j][k][z]=max(dp[i][j][k][z],dp[i-1][j][k][z]+a[t]);
if(j)
dp[i][j][k][z]=max(dp[i][j][k][z],dp[i][j-1][k][z]+a[t]);
if(k)
dp[i][j][k][z]=max(dp[i][j][k][z],dp[i][j][k-1][z]+a[t]);
if(z)
dp[i][j][k][z]=max(dp[i][j][k][z],dp[i][j][k][z-1]+a[t]);
}
}
}
}
cout << dp[co[1]][co[2]][co[3]][co[4]] << endl ;
return 0;
}