对于区间DP,首先枚举要进行操作的区间长,然后枚举操作区间的左端点,用左端点和区间长算出右端点,然后枚举区间中的点进行DP操作就好了。
下面是模式代码:
首先是P的:
For p:=1 to n do // p是区间长度,作为阶段。
for i:=1 to n do // i是穷举的区间的起点
begin
j:=i+p-1; // j是 区间的终点,这样所有的区间就穷举完毕
if j>n then break; // 这个if很关键。
for k:= i to j-1 do // 状态转移,去推出 f[i,j]
f[i , j]= max{f[ i,k]+ f[k+1,j]+ w[i,j] }
end;
福利:自己翻译成C++
for(int l=1;l<=n;l++)
{
for(int i=1;i<=n-l+1;i++)
{
int j=i+p-1;
for(int k=i;k<=j;k++)
{
f[i][j]=max/min(f[i][j],f[i][k]+f[k+1][j]+w[i,j]);
}
}
}