gcdgcd共有nn件衣服,编号为A1,A2,⋯An每一件衣服分别拥有颜色值和清洗时间,他在每一件衣服穿完以后都会将其送去清洗,而这件衣服当天所拥有的舒适感取决于当天的天气与他的衣服颜色值的乘积。
PS:天气值存在负数
现给出共mm天的天气情况,求最大舒适值。如果必定有一天gcdgcd没有衣服穿,输出"gcd loves her clothes!"。
听说要4进制状压?
5维数组跑的毫无压力(~ ̄▽ ̄)~
夸我蚂蜂美丽
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
#define M -999999999999999
#define max(a,b) ((a)>(b)? (a):(b))
#define min(a,b) ((a)<(b)? (a):(b))
using namespace std;
int i,m,n,j,k,x[10001],y[10001],z[10001],a,b,c,d;
LL f[7][7][7][7][2001],ans=M-1;
int main()
{
memset(f,-0x3f,sizeof(f));
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) scanf("%d",&x[i]);
for(i=1;i<=n;i++) scanf("%d",&y[i]);
for(i=1;i<=m;i++) scanf("%d",&z[i]);
f[0][0][0][0][0]=0;
for(i=0;i<m;i++)
for(a=0;a<=y[1];a++)
for(b=0;b<=y[2];b++)
for(c=0;c<=y[3];c++)
for(d=0;d<=y[4];d++)
{
if(a && b && c && d) continue;
if(f[a][b][c][d][i]<M) continue;
if(n>=1 && (!a)) f[y[1]][max(b-1,0)][max(c-1,0)][max(d-1,0)][i+1]=max(f[a][b][c][d][i]+(LL)z[i+1]*x[1],f[y[1]][max(b-1,0)][max(c-1,0)][max(d-1,0)][i+1]);
if(n>=2 && (!b)) f[max(a-1,0)][y[2]][max(c-1,0)][max(d-1,0)][i+1]=max(f[a][b][c][d][i]+(LL)z[i+1]*x[2],f[max(a-1,0)][y[2]][max(c-1,0)][max(d-1,0)][i+1]);
if(n>=3 && (!c)) f[max(a-1,0)][max(b-1,0)][y[3]][max(d-1,0)][i+1]=max(f[a][b][c][d][i]+(LL)z[i+1]*x[3],f[max(a-1,0)][max(b-1,0)][y[3]][max(d-1,0)][i+1]);
if(n>=4 && (!d)) f[max(a-1,0)][max(b-1,0)][max(c-1,0)][y[4]][i+1]=max(f[a][b][c][d][i]+(LL)z[i+1]*x[4],f[max(a-1,0)][max(b-1,0)][max(c-1,0)][y[4]][i+1]);
}
for(a=0;a<=y[1];a++)
for(b=0;b<=y[2];b++)
for(c=0;c<=y[3];c++)
for(d=0;d<=y[4];d++)
ans=max(ans,f[a][b][c][d][m]);
if(ans<M) printf("gcd loves her clothes!");
else printf("%lld",ans);
}