LuoGu P1541 乌龟棋

题目传送门
乌龟棋我并不知道他为啥是个绿题0.0
总之感觉思维含量确实不太高(虽然我弱DP)(毛多弱火,体大弱门,肥胖弱菊,骑士弱梯,入侵弱智,沙华弱Dp)
总之,设计出来状态这题就很简单了
设$f[i][j][k][l]$表示第一种卡片用了$i$张,第二种用了$j$张,以此类推就好了(我太懒了啦)
然后枚举每种卡片,判断满足每种卡片最少用0张,转移就行了!

#include <iostream>
#include <cstdlib>
#include <cstdio>
#define min(a,b) (a<b?a:b)

using namespace std;

const int M=40;
const int N=355;

int f[M][M][M][M],n,m;
int val[N],card[5],x;

int main(){
    scanf("%d%d",&n,&m);
    for(register int i=1;i<=n;++i) scanf("%d",&val[i]);
    for(register int i=1;i<=m;++i) scanf("%d",&x),++card[x];
    f[0][0][0][0]=val[1];
    for(register int i=0;i<=card[1];++i){
        for(register int j=0;j<=card[2];++j){
            for(register int k=0;k<=card[3];++k){
                for(register int l=0;l<=card[4];++l){
                    register int step=i+(j<<1)+((k<<1)+k)+(l<<2)+1;
                    if(i!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k][l]+val[step]);
                    if(j!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k][l]+val[step]);
                    if(k!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k-1][l]+val[step]);
                    if(l!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k][l-1]+val[step]);
                }
            }
        }
    }
    printf("%d\n",f[card[1]][card[2]][card[3]][card[4]]);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Equinox-Flower/p/9630512.html