核心思想
区间DP,顾名思义,就是枚举区间进行DP。用dp[i][j]表示一个区间的最优解,然后从小区间向大区间合并,最终求得整个大区间的解。
算法过程就是三层枚举,第一层枚举区间长度,第二次枚举区间起点,第三层枚举区间分割点。
这样在枚举第二层的时候,可以保证第三层的区间已经枚举过了。
状态转移:
dp[i][j] = max(dp[i][j],dp[i][k]+dp[k+1][j]+w[i][j]);
模板
朴素枚举:n3
memset(dp,0,sizeof(dp)) //初始dp数组
for(int len=1;len<=n;len++){ //第一层枚举区间长度
for(int i=0;i+len <= n;++i){ //枚举区间的起点
int j=i+len-1; //根据起点和长度得出终点
for(int k=i;k<=j;++k) //枚举分割点
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+w[i][j]);//状态转移方程
}
}
四边形优化代码:n2
for(int len=2;len<=n;len++){
for(int i = 1;i<=n;i++){
int j = i+len-1;
if(j>n) break;
for(int k = s[i][j-1];k<=s[i+1][j];k++){
if(dp[i][j]>dp[i][k]+dp[k+1][j]+w[i][j]){
dp[i][j]=dp[i][k]+dp[k+1][j]+w[i][j];
s[i][j]=k;
}
}
}
}