本题数据过水
查看原帖
本题数据过水
447476
Alcl000000楼主2023/7/17 08:48

以下代码时间复杂度为O(1100*m^3),但开O2可以通过本题

# include <bits/stdc++.h>
using namespace std;
int n,m,k,c;
int a[100005],b[100005],f[105][105][2005],p[1005],q[1005],v[1005],w[10005];//前i场,看j,小红=k时小明最大值 
int main(){
	cin>>n>>m>>k>>c;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	} 
	for(int i=1;i<=n;i++){
		cin>>b[i];
	} 
	for(int i=1;i<=m;i++){
		cin>>p[i]>>q[i];
		v[i]=a[p[i]]*a[q[i]];
		w[i]=b[p[i]]+b[q[i]];
	}
	memset(f,-0x3f,sizeof(f));
	for(int i=1;i<=m;i++){
		f[i][1][w[i]]=v[i];
		f[i][0][0]=0;
	}
	
	for(int i=1;i<=m;i++){
		for(int j=0;j<=min(k,i);j++){
			for(int k=0;k<=1100;k++){
				for(int l=i+1;l<=m;l++){
					f[l][j+1][k+w[l]]=max(f[l][j+1][k+w[l]],f[i][j][k]+v[l]);
					f[l][j][k]=max(f[l][j][k],f[i][j][k]);
				}
			}
		}
	}
//	for(int i=1;i<=m;i++){
//		for(int j=0;j<=min(k,i);j++){
//			for(int k=0;k<=c+20;k++){
//				cout<<i<<" "<<j<<" "<<k<<" "<<f[i][j][k]<<endl;
//			}
//		}
//	}
	int ans=-1;
	for(int j=c;j<=2000;j++){
		ans=max(ans,f[m][k][j]);
	//	cout<<f[m][k][j]<<endl;
	}
	if(ans<=-1){
		cout<<-1;
	}
	else
	cout<<ans;
	return 0;
}

刚学OI1秒的蒟蒻求大佬指点,还是本来就让过?

2023/7/17 08:48
加载中...