92分MLE最后一个点求助
查看原帖
92分MLE最后一个点求助
891152
bz029楼主2024/7/10 16:04
#include <bits/stdc++.h>
using namespace std;
 
int n,b,a[3832],dp[3832][3832][3],ans;

int main(){
    scanf("%d%d",&n,&b);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    for(int i=1;i<=n;i++){
        for(int j=b;j>=0;j--){
            dp[i][j][0]=dp[i][j][1]=dp[i][j][2]=-1;
        }
    }
    dp[1][0][0]=0;
    dp[1][1][1]=0;
    for(int i=2;i<=n;i++){
        dp[i][0][0]=max(dp[i-1][0][0],dp[i-1][0][2]);
        for(int j=b;j>=1;j--){
            dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j][2]);
            dp[i][j][1]=dp[i-1][j-1][0];
            if(dp[i-1][j-1][1]>=0 || dp[i-1][j-1][2]>=0){
                dp[i][j][2]=max(dp[i-1][j-1][1],dp[i-1][j-1][2])+a[i];
            }
            
        }
    }
    ans=max(dp[n][b][0],dp[n][b][2]);
    for(int i=1;i<=n;i++){
        for(int j=b;j>=0;j--){
            dp[i][j][0]=dp[i][j][1]=dp[i][j][2]=-1;
        }
    }
    dp[1][1][2]=a[1];
    for(int i=2;i<=n;i++){
        dp[i][0][0]=max(dp[i-1][0][0],dp[i-1][0][2]);
        for(int j=b;j>=1;j--){
            dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j][2]);
            dp[i][j][1]=dp[i-1][j-1][0];
            if(dp[i-1][j-1][1]>=0 || dp[i-1][j-1][2]>=0){
                dp[i][j][2]=max(dp[i-1][j-1][1],dp[i-1][j-1][2])+a[i];
            }
        }
    }
    ans=max(ans,max(dp[n][b][1],dp[n][b][2]));
    cout<<ans<<endl;
    
    
    return 0;
}
2024/7/10 16:04
加载中...