正题
评测记录链接:https://www.luogu.org/recordnew/lists?uid=52918&pid=P1541
题目大意
在不同的格子停留会获得不同的价值,有m张移动牌,可以移动1∼41∼4步(每张牌固定),求最大价值。
解题思路
用fx1,x2,x3,x4fx1,x2,x3,x4来表示有x1张移动1格的牌,x2张移动2格的牌,x3张移动3格的牌,x4张移动4格的牌。然后动态转移不想解释。
code
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,c[360],t[5],f[131][131][131][131],x;
int way(int x,int y,int z,int w)
{return c[1+x+y*2+z*3+w*4];}//计算价值
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&c[i]);for(int i=1;i<=m;i++){scanf("%d",&x);t[x]++;}f[0][0][0][0]=c[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 q=0;q<=t[4];q++){if(i)f[i][j][k][q]=max(f[i][j][k][q],f[i-1][j][k][q]+way(i,j,k,q));if(j)f[i][j][k][q]=max(f[i][j][k][q],f[i][j-1][k][q]+way(i,j,k,q));if(k)f[i][j][k][q]=max(f[i][j][k][q],f[i][j][k-1][q]+way(i,j,k,q));if(q)f[i][j][k][q]=max(f[i][j][k][q],f[i][j][k][q-1]+way(i,j,k,q));} printf("%d",f[t[1]][t[2]][t[3]][t[4]]);
}