不应该会MLE的代码莫名其妙MLE了一个点,求各位大佬解惑
  • 板块学术版
  • 楼主拱垲
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/11/3 17:21
  • 上次更新2023/11/3 20:03:11
查看原帖
不应该会MLE的代码莫名其妙MLE了一个点,求各位大佬解惑
139334
拱垲楼主2023/11/3 17:21

P1616 题目说m*t<1e7,我创建了一个DP[m][t]的动态数组,显然不该MLE,但偏偏就是MLE了两个点得80分,更抽象的是我把m和t互换后变成只MLE一个点了,m和t谁做行谁做列总空间不应该差不多吗.... 总之一百多万个longlong空间也就二三十M,空间限制是128MB,不应该超空间,不理解为什么,是不是我对new的理解有误呀,求各位大佬解惑

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <stack>
#include <queue>
#include <map>
#include <unordered_map>
#include <cmath>
using namespace std;
#define int long long
int ** DP;
int dfs(int m,int ct,const int * const a,const int * const b)//ct is counted_time,m is drug
{
	if(ct==0)return 0;
	if(m==0) return 0;
	if(m==1) return DP[m][ct]=ct/a[m]*b[m];
	if(DP[m][ct]!=-1)return DP[m][ct];

	int DFS=0;
	for(int i=0;i<=ct/a[m];i++)
		DFS=max(DFS,dfs(m-1,ct-i*a[m],a,b)+i*b[m]);
	return DP[m][ct]=DFS;
}
signed main()
{
	//初始化
	int t,m,*a,*b;
	cin>>t>>m;
	DP=new int* [m+1];
	for(int i=0;i<=m;i++)
		DP[i]=new int [t+1];
	for(int i=0;i<=m;i++)
		for(int j=0;j<=t;j++)
			DP[i][j]=-1;
	a=new int [m+1];
	b=new int [m+1];
	for(int i=1;i<=m;i++)
		cin>>a[i]>>b[i];
	//运算
	cout<<dfs(m,t,a,b)<<endl;

	//delete
	for(int i=0;i<=m;i++)
		delete []DP[i];
	delete []DP;
	delete a;
	delete b;
	return 0;
}
2023/11/3 17:21
加载中...