求助本题空间。
查看原帖
求助本题空间。
178195
人间温柔楼主2022/3/15 07:49

rt,我写出了如下代码,应该已经是正解了,但是这份代码 MLE 了,应该主要问题是在 flagflag 数组上,想请教各位大佬,有没有办法再压缩一下空间?

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int maxn=71;
const int inf=1e8;

int n,sum;
int flag[maxn][1200][1200];
//int mem[maxn][2105][2105];
//map<int,int>flag[2105][2105];
//map<int,int>mem[2105][2105];
//struct node{
//	int h,w;
//}a[maxn];
int h[maxn],w[maxn];

int min3(int a,int b,int c){
	return min(a,min(b,c));
}

int max3(int a,int b,int c){
	return max(a,max(b,c));
}

//h1_plus_h2
int dp(int i,int w1,int w2){
	if(w1<0 || w2<0) return inf;
	if(i==0){
		if(w1==0 && w2==0)
			return 0;
		else
			return inf;
	} else {
		if(flag[i][w1][w2]!=0)return flag[i][w1][w2];
		int x=dp(i-1,w1,w2);
		
		int y=dp(i-1,w1-w[i],w2);
		if(w1==w[i]) y+=h[i];
		
		int z=dp(i-1,w1,w2-w[i]);
		if(w2==w[i]) z+=h[i];
		
		int ret=min3(x,y,z);
		flag[i][w1][w2]=ret;
//		mem[w1][w2][i]=ret;
		return ret;
	}
}

//bool cmp(node x,node y){
//	return x.h>y.h;
//}

int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>h[i]>>w[i];
		sum+=w[i];
	}
//	sort(a,a+n,cmp);
	for(int i=0;i<n;i++){
		for(int j=i+1;j<n;j++){
			if(h[i]<h[j]){
				swap(h[i],h[j]);
				swap(w[i],w[j]);
			}
		}
	}
//	for(int i=0;i<=n;i++){
//		for(int j=0;j<=2101;j++){
//			for(int k=0;k<=2101;k++){
//				flag[i][j][k]=-1;
//			}
//		}
//	}
	
	ll ans=inf;
	for(int w1=sum;w1>0;w1--){
		for(int w2=sum-w1;w2>0;w2--){
			ll h12=dp(n-1,w1,w2);
			int w3=sum-w1-w2;
			ans=min(ans,(h12+h[0])*max3(w1,w2,w3));
		}
	}
	cout<<ans<<endl;
	return 0;
}
2022/3/15 07:49
加载中...