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;
}