1 条题解

  • 0
    @ 2024-10-18 20:47:43

    可以用上记忆化搜索

    #include<bits/stdc++.h>
    #define I return
    #define want 0
    #define AC ;
    using namespace std AC
    const int N = 350 + 1,M = 40 + 1 AC
    int n, m, a[N], bi, b[5] AC
    short dp[M][M][M][M] AC
    int _AC(int ac, int b1, int b2, int b3, int b4){
        if(dp[b1][b2][b3][b4]) return dp[b1][b2][b3][b4] AC
        int maxNext = 0 AC
        if(b1 > 0) maxNext = max(maxNext, _AC(ac+1, b1-1, b2, b3, b4)) AC
        if(b2 > 0) maxNext = max(maxNext, _AC(ac+2, b1, b2-1, b3, b4)) AC
        if(b3 > 0) maxNext = max(maxNext, _AC(ac+3, b1, b2, b3-1, b4)) AC
        if(b4 > 0) maxNext = max(maxNext, _AC(ac+4, b1, b2, b3, b4-1)) AC
        return dp[b1][b2][b3][b4] = a[ac] + maxNext AC
    }
    int main(){
        scanf("%d %d", &n, &m) AC
        for(int i=1; i<=n; ++i) scanf("%d", &a[i]) AC
        for(int i=1; i<=m; ++i) scanf("%d", &bi), ++b[bi] AC
        printf("%d",_AC(1, b[1], b[2], b[3], b[4])) AC
    	I want AC
    }
    

    提交记录

    信息

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