1 条题解

  • 0
    @ 2025-5-8 20:01:42

    题解

    核心是把环形dp转化成两次线性dp。具体如何实现的呢?不考虑环形的话会遗漏一种情况,就是时间片1是睡着了的,所以第二次dp的时候把时间片n和1设置为入睡,具体操作为初始化dp[1][1][1]=utility[1],更新答案的时候只更dp[n&1][b][1]。

    代码:

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int N=4e3;
    const int INF=0x3f3f3f3f;
    int dp[2][N][2];
    int n,b;
    int u[N];
    int ans=0;
    int main()
    {
        cin>>n>>b;
        for(int i=1;i<=n;++i)
            cin>>u[i];
        memset(dp,-INF,sizeof(dp));
        dp[0][0][0]=dp[1][1][1]=dp[1][0][0]=0;
        for(int i=2;i<=n;++i)           //start from 2
        {
            int k=i&1;
            for(int j=1;j<=i;++j)
            {
                dp[k][j][0]=max(dp[k^1][j][0],dp[k^1][j][1]);
                dp[k][j][1]=max(dp[k^1][j-1][0],dp[k^1][j-1][1]+u[i]);
            }
        }
        ans=max(dp[n&1][b][0],dp[n&1][b][1]);
        memset(dp,-INF,sizeof(dp));
        dp[1][1][1]=u[1];
        dp[0][0][0]=dp[1][0][0]=0;
        for(int i=2;i<=n;++i)
        {
            int k=i&1;
            for(int j=1;j<=i;++j)       //here
            {
                dp[k][j][0]=max(dp[k^1][j][0],dp[k^1][j][1]);
                dp[k][j][1]=max(dp[k^1][j-1][0],dp[k^1][j-1][1]+u[i]);
            }
        }
        ans=max(ans,dp[n&1][b][1]);
        cout<<ans<<endl;
        return 0;
     
     
     
    }
    
    • 1

    信息

    ID
    1229
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者