(62条消息) CCPC 2020 广告投放_correct!的博客-CSDN博客
一维滚动时不会受到影响是因为他dp转移的时候都是根据后边的量进行转移的a[j]/d[i]又是从小到大的
所以不存在后面的量根据前面转移过来
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define YES cout<<"YES"<<endl
#define NO cout<<"NO"<<endl
typedef long long ll;
typedef pair<int,int> PII;
const ll mod=1e9+7;
const int INF=0x3f3f3f3f;
const int N = 1e5+10;
int a[N];int p[N];int d[N];int vis[N];
int dp[N];
#define ios ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
void solve()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>p[i];
}
for(int j=1;j<=n;j++)
{
cin>>d[j];
}
int cnt=0;
a[++cnt]=0;
for(int i=1;i<=m;i++)
{
if(!vis[m/i])
{
vis[m/i]=1;
a[++cnt]=m/i;
}
}
sort(a+1,a+1+cnt);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=cnt;j+)
{
dp[a[j]/d[i]]=max(dp[a[j]/d[i]],dp[a[j]]+p[i]*a[j]);
}
}
int ans=-1;
for(int i=0;i<=m;i++)
{
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
}
signed main()
{
int t;
t=1;
while(t--)
{
solve();
}
}