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
",f[card[1]][card[2]][card[3]][card[4]]);
	return 0;
}
May you return with a young heart after years of fighting.
原文地址:https://www.cnblogs.com/Equinox-Flower/p/9630512.html