为什么这样优化空间不对?
查看原帖
为什么这样优化空间不对?
1122530
elpsconr楼主2024/12/2 12:36

求教怎么优化这段代码的空间

AC代码

#include<bits/stdc++.h>
using namespace std;
//#define int long long
#define PII pair<int,int>
#define tul tuple<int,int,int>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define rep_(i,a,b) for(int i=a;i>=b;--i)
#define all(x) x.begin(),x.end()
#define bp(x) __builtin_popcountll(x)
#define ctz(x) __builtin_ctzll(x)
#define cy cout<<"YES"<<endl
#define cn cout<<"NO"<<endl
#define lc (rt<<1)
#define rc (rt<<1|1)
mt19937_64 rnd(time(0));
const int N=1e4+5,yyx=998244353;
vector<int> to[N];
int n,m,k;
int x[N],y[N];
int dp[N][2005];
int l[N],r[N],st[N];
inline int mod(int x){
  return (x%yyx+yyx)%yyx;
}
inline int cmin(int &x,int y){
  return x>y?x=y,1:0;
}
inline int cmax(int &x,int y){
  return x<y?x=y,1:0;
}
inline void solve(){
  cin>>n>>m>>k;
  rep(i,1,n) cin>>x[i]>>y[i],l[i]=1,r[i]=m;
  rep(i,1,k){
    int a,b,c;cin>>a>>b>>c;
    st[a]=1;
    l[a]=b+1,r[a]=c-1;
  }
  rep(i,0,n) rep(j,0,m*2) dp[i][j]=2e9;
  rep(i,1,m) dp[0][i]=0;//到达前i个位置,高度为j时最少需要点击次数
  rep(i,1,n){
    rep(j,x[i],m+x[i]){
        cmin(dp[i][j],dp[i-1][j-x[i]]+1);
        cmin(dp[i][j],dp[i][j-x[i]]+1);
    }
    rep(j,m+1,m+x[i]) cmin(dp[i][m],dp[i][j]);
    rep(j,1,m-y[i]) cmin(dp[i][j],dp[i-1][j+y[i]]);
    rep(j,1,l[i]-1) dp[i][j]=2e9;
    rep(j,r[i]+1,m) dp[i][j]=2e9;
  }
  int ans=2e9;
  rep(i,1,m) cmin(ans,dp[n][i]);
  if(ans<2e9){
    cout<<1<<"\n"<<ans<<endl;
  }
  else{
    int z=0,j;
    rep_(i,n,1){
        for(j=1;j<=m;++j){
          if(dp[i][j]<2e9){
            z=i;break;
          }
        }
        if(j<=m){
            z=i;break;
        }
    }
    int ans=0;
    rep(i,1,z) if(st[i]) ans++;
    cout<<0<<"\n"<<ans<<endl;
  }
}
signed main(){
  cin.tie(0)->sync_with_stdio(0);
  //freopen("D://321//in.txt","r",stdin);
  //freopen("D://321//out.txt","w",stdout);
  int _=1;
  //cin>>_;
  while(_--)
  solve();
  return 0;
}

用滚动数组优化就出错了

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define tul tuple<int,int,int>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define rep_(i,a,b) for(int i=a;i>=b;--i)
#define all(x) x.begin(),x.end()
#define bp(x) __builtin_popcountll(x)
#define ctz(x) __builtin_ctzll(x)
#define cy cout<<"YES"<<endl
#define cn cout<<"NO"<<endl
#define lc (rt<<1)
#define rc (rt<<1|1)
mt19937_64 rnd(time(0));
const int N=1e4+5,yyx=998244353;
vector<int> to[N];
int n,m,k;
int x[N],y[N];
int dp[2][2005];
int l[N],r[N],st[N];
inline int mod(int x){
  return (x%yyx+yyx)%yyx;
}
inline int cmin(int &x,int y){
  return x>y?x=y,1:0;
}
inline int cmax(int &x,int y){
  return x<y?x=y,1:0;
}
inline void solve(){
  cin>>n>>m>>k;
  rep(i,1,n) cin>>x[i]>>y[i],l[i]=1,r[i]=m;
  rep(i,1,k){
    int a,b,c;cin>>a>>b>>c;
    st[a]=1;
    l[a]=b+1,r[a]=c-1;
  }
  int cnt=0;
  rep(i,0,n) rep(j,0,m*2) dp[i&1][j]=2e9;
  rep(i,1,m) dp[0][i]=0;//到达前i个位置,高度为j时最少需要点击次数
  rep(i,1,n){
    rep(j,0,m) dp[i&1][j]=2e9;
    rep(j,x[i]+1,m+x[i]){
        cmin(dp[i&1][j],dp[(i&1)^1][j-x[i]]+1);
        cmin(dp[i&1][j],dp[i&1][j-x[i]]+1);
    }
    rep(j,m+1,m+x[i]) cmin(dp[i&1][m],dp[i&1][j]);
    rep(j,1,m-y[i]) cmin(dp[i&1][j],dp[(i&1)^1][j+y[i]]);
    if(st[i]){
        int ans=2e9;
        rep(j,1,l[i]-1) dp[i&1][j]=2e9;
        rep(j,r[i]+1,m) dp[i&1][j]=2e9;
        rep(j,1,m) cmin(ans,dp[i&1][j]);
        if(ans==2e9){
            cout<<0<<"\n"<<cnt<<endl;return;
        }
        ++cnt;
    }
  }
  int ans=2e9;
  rep(i,1,m) cmin(ans,dp[n&1][i]);
  cout<<1<<"\n"<<ans<<endl;
}
signed main(){
  cin.tie(0)->sync_with_stdio(0);
  //freopen("D://321//in.txt","r",stdin);
  //freopen("D://321//out.txt","w",stdout);
  int _=1;
  //cin>>_;
  while(_--)
  solve();
  return 0;
}
2024/12/2 12:36
加载中...