参考课程是我高中信息竞赛邱老师的课程。
【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
提供课程,但是博主没做出来