AcWing 312. 乌龟棋
原题链接
简单
作者:
洛零
,
2020-08-25 20:35:35
,
所有人可见
,
阅读 666
#include <bits/stdc++.h>
#define dis(i,j,k,l) a[i+j*2+k*3+l*4+1] //这个就是上图的d
using namespace std;
const int N=45;
int n,m,a[355],c[125];
int f[N][N][N][N];
int cnt[5];
int main() {
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=m;i++) {
cin>>c[i];
cnt[c[i]]++; //统计每张卡牌出现的次数
}
f[0][0][0][0]=a[1]; //初值
for(int i=0;i<=cnt[1];i++)
for(int j=0;j<=cnt[2];j++)
for(int k=0;k<=cnt[3];k++)
for(int l=0;l<=cnt[4];l++) {
//枚举上一个状态
if(i)
f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k][l]+dis(i,j,k,l));
if(j)
f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k][l]+dis(i,j,k,l));
if(k)
f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k-1][l]+dis(i,j,k,l));
if(l)
f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k][l-1]+dis(i,j,k,l));
}
cout<<f[cnt[1]][cnt[2]][cnt[3]][cnt[4]]; //最终值即每种卡牌都用完了
return 0;
}