ACM CSP竞赛笔记(二十)——区间动态规划与特殊DP

参考课程是我高中信息竞赛邱老师的课程。

【16-4 区间动态规划】 https://www.bilibili.com/video/BV1Ar421L7d6/?share_source=copy_web\&vd_source=2c56c6a2645587b49d62e5b12b253dca

【16-4 区间动态规划习题解答】 https://www.bilibili.com/video/BV1Cy411a7hd/?share_source=copy_web\&vd_source=2c56c6a2645587b49d62e5b12b253dca

需要完整ACM CSP 板子的可以去资源找,我设置的0积分,如果还要花钱来B站私我!

区间动态规划 P1775

模板思路:

如果确定是区间DP,状态就是FLR,但是有些题可能需要额外的状态标记。

https://www.luogu.com.cn/problem/P1775

合并石子是不一样的,同一级区间内部合并代价一致,但是不同层次的合并代价不同。

(2) (2,5) (2,5,1)(2,5,1,4)

(2)(2,5) (1) (1,4) (2,5,1,4)

那么如何DP呢?

找状态:问题是求一个区间的最小合并代价。

子问题是 某个区间L,R内的最小代价。 定义FLR为区间最小代价

然后找初始状态,FLL=0 FLR=INT_MAX

结束状态,F1N

转移方程:当前层的合并代价就是区间和,但是前一级的合并方式会影响代价。

看到Σ立马考虑区间和。前缀和。

方案一:记忆化深搜

无穷大的防溢出表达:0x3f

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int presum[305];
int st[305];
int N;
int F[305][305];
//记录DFS:搜索中如果遇到计算过的直接跳过
int dfs(int L,int R){
    if(L==R){//如果区间长度为0 就0
        return 0;
    }else if(F[L][R]!=0x3f3f3f3f){//如果区间被计算过
        return F[L][R];
    }else{//否则迭代计算
        for(int i=L;i<R;i++){//遍历所有的分割点,找最小分割代价
            F[L][R]=min(F[L][R],dfs(L,i)+dfs(i+1,R)+presum[R]-presum[L-1]);   
        }
        return F[L][R];
    }
}

int main(){
    cin>>N;
    for(int i=1;i<=N;i++){
        cin>>st[i];
        presum[i]=presum[i-1]+st[i];
    }
    //设置整个F区间为INT_MAX 未被计算
    memset(F,0x3f,sizeof(F));
    cout<<dfs(1,N);
    
}

方案二:循环

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int presum[305];
int st[305];
int N;
int F[305][305];

int main(){
    cin>>N;
    for(int i=1;i<=N;i++){
        cin>>st[i];
        presum[i]=presum[i-1]+st[i];
    }
    //设置整个F区间为INT_MAX 未被计算
    memset(F,0x3f,sizeof(F));
    for(int i = 1; i <= N; i++){
        F[i][i] = 0; 
    }
    for(int len=1;len<N;len++){//枚举长度
        for(int L=1;L<=N-len;L++){//枚举左端点
            int R=L+len;//右端点可以直接得到
            for(int k=L;k<R;k++){//遍历所有分割点
                F[L][R]=min(F[L][R],F[L][k]+F[k+1][R]+presum[R]-presum[L-1]);
            }
        }
    }
    cout<<F[1][N];
    
}

环形动态规划(遇到放弃)

【16-5 环形动态规划】 https://www.bilibili.com/video/BV1uZ421x7WL/?share_source=copy_web\&vd_source=2c56c6a2645587b49d62e5b12b253dca

【16-5 环形动态规划习题解答】 https://www.bilibili.com/video/BV1vz421875a/?share_source=copy_web\&vd_source=2c56c6a2645587b49d62e5b12b253dca

提供课程,但是博主没做出来

断环为链

树形动态规划(遇到放弃)

【16-6 树形动态规划】 https://www.bilibili.com/video/BV1WM4m1U7Ho/?share_source=copy_web\&vd_source=2c56c6a2645587b49d62e5b12b253dca

【16-6 树形动态规划习题解答】 https://www.bilibili.com/video/BV1Nm421K7PH/?share_source=copy_web\&vd_source=2c56c6a2645587b49d62e5b12b253dca

提供课程,但是博主没做出来