AC_AC's blog

By AC_AC, history, 4 years ago, In English

I was solving Book Shop of CSES DP section.

  • I am getting TLE even after multiple attempts, Can you tell me how to optimize my TOP-DOWN approach.
  • I have tried replacing 2-d array with 2-d vector .
  • I have also tried swapping the dimensions of dp array ( some caching thing ).
my code
  • Vote: I like it
  • 0
  • Vote: I do not like it

| Write comment?
»
4 years ago, # |
  Vote: I like it 0 Vote: I do not like it

Everything is fine. Just set dp[index][total] = ans before returning.

  • »
    »
    4 years ago, # ^ |
      Vote: I like it +1 Vote: I do not like it

    it is referenced with variable named ans,so i guess it should be fine, right??

»
4 years ago, # |
  Vote: I like it +1 Vote: I do not like it

The time constraints in the CSES Problem set are very tight! In some problems using long long instead of int might also give TLE. So its always better to use Iterative method rather than Recursive(for CSES)

  • »
    »
    4 years ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    yeah i read it somewhere, so should i assume that it is unsolvable using TOP-DOWN approach(on CSES)??

    • »
      »
      »
      4 years ago, # ^ |
        Vote: I like it +1 Vote: I do not like it

      It might work for some Problems I'm not too sure about that but I do remember trying top_down approach for some Problems and got TLE too! Not that the solution was wrong, but the time constraints were just too tight for recursive solutions!! So yeah if you want AC in CSES then you have to solve iteratively(atleast for most of them or even all of them)!

  • »
    »
    4 years ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    I kept on getting runtime error on my bottom up dp solution just because I used long long

  • »
    »
    3 years ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    this worked for me...

    • »
      »
      »
      21 month(s) ago, # ^ |
        Vote: I like it 0 Vote: I do not like it

      bro can you paste the AC code (recursive one)

      • »
        »
        »
        »
        21 month(s) ago, # ^ |
          Vote: I like it 0 Vote: I do not like it

        Sorry I haven't written recursive . But iterative one :

        include<bits/stdc++.h>

        using namespace std;

        int mod = 1e9 +7; int main(){ int n,x; cin>>n>>x; pair<int,int> h[n];

        for(int i=0;i<n;i++){
            cin>>h[i].first;
        }
        for(int i=0;i<n;i++){
            cin>>h[i].second;
        }
        int dp[n+1][x+1];
        dp[0][0]=0;
        for(int i=0;i<=n;i++){
            dp[i][0] = 0;
        }
        for(int i=0;i<=x;i++){dp[0][i]=0;}
        for(int i=1;i<=n;i++){
            for(int j=1;j<=x;j++){
                dp[i][j] = dp[i-1][j];
                if(j>=h[i-1].first){
                    dp[i][j] = max(dp[i-1][j- h[i-1].first]+h[i-1].second,dp[i][j]);
                }
                dp[i][j] %= mod;
            }
        }

        cout<<dp[n][x]<<"\n"; }

        • »
          »
          »
          »
          »
          21 month(s) ago, # ^ |
          Rev. 2   Vote: I like it 0 Vote: I do not like it

          I am using iterative way but still getting tle what could be the reason here is the code

          include

          include

          using namespace std;

          int main() { ios::sync_with_stdio(false); cin.tie(0);

          int n, x;
          cin >> n >> x;
          int dp[x + 1][n + 1];
          int prices[n + 1];
          int pages[n + 1];
          memset(dp, 0, sizeof(dp));
          
          for (int i = 1; i <= n; i++)
          {
              cin >> prices[i];
          }
          for (int j = 1; j <= n; j++)
          {
              cin >> pages[j];
          }
          
          for (int i = 1; i <= x; i++)
          {
              for (int j = 1; j <= n; j++)
              {
                  dp[i][j] = max(dp[i][j - 1], (i - prices[j]) >= 0 ? (dp[i - prices[j]][j - 1] + pages[j]) : 0);
              }
          }
          
          cout << dp[x][n] << "\n";
          return 0;

          }

          • »
            »
            »
            »
            »
            »
            19 months ago, # ^ |
              Vote: I like it +3 Vote: I do not like it

            Your code seems perfect to me. Did you find the error?

»
7 months ago, # |
  Vote: I like it 0 Vote: I do not like it

Surprisingly, my solution with a complexity of O(1e8) was accepted, and it ran in only 0.1 seconds.

  • »
    »
    6 months ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    can you paste your code here

    • »
      »
      »
      6 months ago, # ^ |
      Rev. 4   Vote: I like it 0 Vote: I do not like it
      #include<bits/stdc++.h>
      using namespace std;
      #define ll long long
      #define fast ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
      ll n,m;
      vector<ll>price,page;
      int32_t main()
      {
          fast
          ll i,j=0,x;
          cin>>n>>x;
          price.resize(n);
          page.resize(n);
          for(auto &it:price){cin>>it;}
          for(auto &it:page){cin>>it;}
          vector<ll>dp(x+1,INT_MIN);
          dp[0]=0;
          for(auto it:price)
          {
              for(i=x;i>=it;i--)
              {
                  dp[i]=max(dp[i],dp[i-it]+page[j]);
              }j++;
          }
          ll ans=0;
          for(i=0;i<=x;i++){ans=max(ans,dp[i]);}
          cout<<ans<<'\n';
      }
      
»
6 months ago, # |
  Vote: I like it 0 Vote: I do not like it

I'm surprised that this is for 3 years ago but the latest comments are from 2 weeks ago.

I just got accepted on the task and I had the same problem. I mean technically it should've been an MLE. I dont know if anyone has said this before or not, but here instead of defining a DP[100000][100] I just defined a DP[100000][2] since you only need dp[j][i-1] to update your DP, So you can just store the previous row of your DP table and use parity to go over the loop and store your values.

here's my code:

#include <bits/stdc++.h>
using namespace std;
 
const int mxx = 1e5 + 1;
const int mxn = 1e3 + 1;
int dp[mxx][2];
int s[mxn], h[mxn];
 
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    int n, x;
    cin >> n >> x;
    for (int i = 0; i < n; i++) cin >> h[i];
    for (int i = 0; i < n; i++) cin >> s[i];
    for (int i = 0; i < x + 1; i++) {
        if (h[0] <= i) dp[i][0] = s[0];
        else dp[i][0] = 0;
    }
 
    for (int i = 1; i < n; i++) {
        for (int j = 0; j <= x; j++) {
            if (h[i] > j) dp[j][i%2] = dp[j][1 - (i%2)];
            else dp[j][i%2] = max(dp[j][1 - (i%2)], dp[j - h[i]][1 - (i%2)] + s[i]);
        }
    }
 
    cout << dp[x][(n-1) % 2];
}