【悬2关】求答关于时间与空间问题
查看原帖
【悬2关】求答关于时间与空间问题
734533
封禁用户楼主2023/8/3 22:58

RT。

在时间复杂度约等于 O(n2k)O(n^2k) 的情况下,DP 数组我开了三维,大小级别分别为:n,n,kn,n,k。

第一次,我将 f\mathit{f} 数组直接写成了三维的 map;TLE on 11。怀疑是 map 占用了较多时间。

第二次,我将 f\mathit{f} 数组写为正常的三维数组;MLE on 1。不理解pwp

所以是我 DP 写错了还是定义数组内存的问题a

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
//f[i][j][k]:前i个数选了,一共还剩下j组为匹配成功(成功了若干组),不和谐值为k的方案数
const int N=202,M=1001;
const int p=1e9+7;
//map<int,map<int,map<int,int> > > f;
int f[N][N][M];
int a[N],n,k;
int ans;
void solve(){
	cin>>n>>k;
	for(int i=1;i<=n;i++) cin>>a[i];
	sort(a+1,a+n+1);
	f[0][0][0]=1;
	for(int i=1;i<=n;i++){
		for(int j=0;j<=i;j++){
			int s=(a[i]-a[i-1])*j;
			for(int K=0;K<=k-s;K++){
				f[i][j][K+s]=(f[i][j][K+s]+f[i-1][j][K])%p;//自己分成一组
				f[i][j][K+s]=(f[i][j][K+s]+f[i-1][j][K]*j)%p;//not max or min
				f[i][j+1][K+s]=(f[i][j+1][K+s]+f[i-1][j][K])%p;//is min
				if(j-1>=0) f[i][j-1][K+s]=(f[i][j-1][K+s]+f[i-1][j][K]*j)%p;//is max(min的情况在j=j-1的时候算过了,而且有a[i]>a[i-1])
			}
		}
	}
	for(int i=0;i<=k;i++){
		ans=(ans+f[n][0][i])%p;//分完之后只能剩0组
	}
	cout<<ans;
}
signed main(){
	solve();
	return 0;
}
2023/8/3 22:58
加载中...