算法描述
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;
代码
区间dp一般由小区间推出大的区间:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
int dp[1010][1010];
int main()
{
for(int i=0;i<n;i++)
dp[i][i]=........
for(int len=1;len<=n;len++)//区间长度
{
for(int i=0;i<n;i++)//区间起点
{
j=len-1+i;//区间终点
for(int k=i;k<j;k++)//k把[i,j]分为[i,k],[k+1,j]
{
dp[i][j]=........
}
}
}