首页 > 其他分享 >2024.6.6

2024.6.6

时间:2024-06-06 17:12:15浏览次数:29  
标签:itn le 2024.6 int ap bs

2024.6.6 【一天高考!!! “夏天周而复始、该相逢的人会再相逢”】

Thursday 五月初一


<theme = oi-"DP">

来学习一下DP的优化

其实考试时我应该很难用到优化的

P2569 [SCOI2010] 股票交易

DP柿子比较好推,

T,Maxp都比较小,

作为f数组的两维还是挺合理的。

那么设f[i][j]为第i天,有j张票的最大价值

\[没票时买\\ f[i][j]\ = \ -ap[i] * j\\ (0 \le j \le as[i])\\ 不参与买卖\\ f[i][j]\ = \ max(f[i][j],f[i-1][j])\\ (0 \le j \le Maxp)\\ 买\\ f[i][j]\ = \ max(f[i][j],f[i-w-1][k]-(j-k)*ap[i])\\ (j-as[i] \le k < j)\\ 卖\\ f[i][j]\ = \ max(f[i][j],f[i−w−1][k]+(k−j)*bp[i])\\ (j < k \le j+bs[i])\\ \]

然后就可以利用单调队列优化了

单调队列

//2024.6.6
//by white_ice
//[SCOI2010] 股票交易 | P2569
#include<bits/stdc++.h>
//#include"fopen.cpp"
using namespace std;
#define itn int
constexpr int oo = 2003;

int jntm(itn a,int b){return a>b?a:b;}
int ngm (itn a,int b){return a<b?a:b;}

int t,p,w;
int ap[oo],bp[oo],as[oo],bs[oo];
int f[oo][oo];

itn stk[oo];

int main(){
    //fre();

    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);

    cin >> t >> p >> w;

    memset(f,128,sizeof(f));

    for (itn i=1;i<=t;i++)
        cin >> ap[i] >> bp[i] >> as[i] >>bs[i];
    
    // for (int i=1;i<=t;i++){
    //     for (itn j=0;j<=as[i];j++)
    //         f[i][j] = -1*j*ap[i];
    
    //     for (itn j=0;j<=p;j++)
    //         f[i][j] = jntm(f[i][j],f[i-1][j]);
    //     if (i<=w)
    //         continue;
    //     int l,r;
    //     l = 1;r = 0;
    //     for (itn j=0;j<=p;j++){
    //         while (l<=r&&stk[l]<j-as[i])
    //             l++;
    //         while (l<=r&&f[i-w-1][stk[r]]+stk[r]*ap[i]<=f[i-w-1][j]+j*ap[i]);
    //                   //f[i-w-1][stk[r]]+stk[r]*ap[i]<=f[i-w-1][j]+j*ap[i]
    //             r--;
    //         stk[++r] = j;
    //         if (l<=r)
    //             f[i][j] = jntm(f[i][j],f[i-w-1][stk[l]]+stk[l]*ap[i]-j*ap[i]);
    //     }                            //f[i-w-1][stk[l]]+stk[l]*ap[i]-j*ap[i]

    //     l = 1,r = 0;
    //     for (itn j=p;j>=0;j--){
    //         while (l<=r&&stk[l]>j+bs[i])
    //             l++;
    //         while (l<=r&&f[i-w-1][stk[r]]+stk[r]*bp[i]<=f[i-w-1][j]+j*bp[i])
    //                    //f[i-w-1][stk[r]]+stk[r]*bp[i]<=f[i-w-1][j]+j*bp[i]
    //             r--;
    //         stk[++r] = j;
    //         if (l<=r)
    //             f[i][j] = jntm(f[i][j],f[i-w-1][stk[l]]+stk[l]*bp[i]-j*bp[i]);
    //                                  //f[i-w-1][stk[l]]+stk[l]*bp[i]-j*bp[i]
    //     }
    // }

    for(int i=1;i<=t;i++){
        cin >> ap[i] >> bp[i] >> as[i] >> bs[i];
        for(int j=0;j<=as[i];j++)
            f[i][j] = -1*j*ap[i]; 
        for(int j=0;j<=p;j++)
            f[i][j] = jntm(f[i][j],f[i-1][j]); 
        if(i<=w)
            continue;    
        int l,r;
        
        l = 1 , r = 0;
        for(int j=0;j<=p;j++){
            while(l<=r&&stk[l]<j-as[i])
                l++; 
            while(l<=r&&f[i-w-1][stk[r]]+stk[r]*ap[i]<=f[i-w-1][j]+j*ap[i])
                r--; 
            stk[++r] = j; 
            if (l<=r)
                f[i][j] = jntm(f[i][j],f[i-w-1][stk[l]]+stk[l]*ap[i]-j*ap[i]); 
        }

        l = 1 , r = 0;
        for(int j=p;j>=0;j--){
            while(l<=r&&stk[l]>j+bs[i])
                l++;
            while(l<=r&&f[i-w-1][stk[r]]+stk[r]*bp[i]<=f[i-w-1][j]+j*bp[i])
                r--;
            stk[++r] = j;
            if(l <= r)
                f[i][j] = jntm(f[i][j],f[i-w-1][stk[l]]+stk[l]*bp[i]-j*bp[i]); 
        }
    }

    int out =  -0x3f3f3f3f;

    for (itn i=0;i<=p;i++)
        out = jntm (out,f[t][i]);
    cout << out;
    return 0;
}

对于一个dp方程

如果,dp[i] = i相关项+j相关项(0<=j<=i)

就可以使用单调队列了

单调队列优化

标签:itn,le,2024.6,int,ap,bs
From: https://www.cnblogs.com/white-ice/p/18235647

相关文章

  • 2024.6.3 时光机会是最没用的发明
    正如标题,时光机会是最无用的发明。如果问昨天的我,时光机有用吗,我会毫不犹豫地回答有用。我希望回到5月,乞求自己好好改初赛;我希望回到1月,乞求自己不要虚度光阴;我希望回到去年9月,乞求自己不要头铁T2,乞求自己检查T1;我希望回到去年6月,乞求自己不要玩florr,这个万恶之源;我希望回到......
  • 2024.6.2
    2024.6.2【明霄升海平,飞彩镌流年。】Sunday四月廿六A.矩形覆盖题目描述有N个矩形,矩形的底边边长为1,且均在X轴上,高度给出,第i个矩形的高为h[i],求最少需要几个矩形才能覆盖这个图形。例如h=[3,2,4,2]的图形如下:image容易发现,只需要3个矩形就能覆盖这个图形。输入......
  • 2024.6 做题记录
    1.#2498.XavierisLearningtoCount有\(n\)个互不相同的整数\(a_{1,\cdots,n}\),从其中任取恰好\(k\)个数,记他们和为\(s\),求对于每个\(s\)的方案数。\(n,a_i\le1.3\times10^4,k\le5\)。根据互不相等容斥的结论,只需枚举集合划分的方案\(\{S_i\}\),钦定同一......
  • [2024.5.31晚~2024.6.1早鲜花] 余生的第一天
    [2024.5.31晚~2024.6.1早鲜花]余生的第一天来\(GF\)集训一两周了,宿舍居然有电梯,而且学生居然可以乘坐,\(GF\)的饭也十分好吃,比\(XF\)的好吃一万倍,听\(yzj\)说清华附的比\(GF\)好吃一万倍,难以想象了认识了好多别的学校的女生!大家都好可爱(●'◡'●),传奇的原神传教大师\(cyl\)有......