目录
显示
题目链接
https://www.luogu.org/problem/P1541
题解
可以用 \(f(i,j,k,l)\)来表示用了 \(i\) 张 \(1\) 牌,\(j\) 张 \(2\) 牌,\(k\) 张 \(3\) 牌,\(l\) 张 \(4\) 牌时,能够得到的最多分数。
注意判断一下状态转移的合法性即可。
#include <cstdio>
#include <algorithm>
using namespace std;
int a[350],f[45][45][45][45],t[5];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=m;i++)
{
int b;
scanf("%d",&b);
t[b]++;
}
f[0][0][0][0]=a[1];//不使用牌时,自动获得起点的分数
for(int i=0;i<=t[1];i++)
for(int j=0;j<=t[2];j++)
for(int k=0;k<=t[3];k++)
for(int l=0;l<=t[4];l++)
{
int num=i+2*j+3*k+4*l+1;
if(i)f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k][l]+a[num]);//使用1牌
if(j)f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k][l]+a[num]);//使用2牌
if(k)f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k-1][l]+a[num]);//使用3牌
if(l)f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k][l-1]+a[num]);//使用4牌
}
printf("%d\n",f[t[1]][t[2]][t[3]][t[4]]);
return 0;
}