Dp[i][j]=dp[i][k]+dp[k+1][j]+w[i][j];
Dp[i][j]表示从i到j合并得到的最小长度,w[i][j]=abs(coor[xi][k+1]-coor[xi][i])+abs(coor[yi][k]-coor[yi][j])
i
K
K+1
J
W[i][j]为合并dp[i][k]和dp[k+1][j]所要付出的花费
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<math.h>
#include<cmath>
using namespace std;
#define maxn 1010
#define xi 1
#define yi 0
#define inf 0x7fffffff
int dp[maxn][maxn];
int s[maxn][maxn];
int coor[2][maxn];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i,j,k;
for(i=1;i<=n;i++)
{
scanf("%d%d",&coor[xi][i],&coor[yi][i]);
s[i][i]=i;
}
int len;
for(len=1;len<=n-1;len++)
for(i=1;i<=n-len;i++)
{
j=len+i;
dp[i][j]=inf;
for(k=s[i][j-1];k<=s[i+1][j];k++)
{
int temp=dp[i][k]+dp[k+1][j]+abs(coor[xi][k+1]-coor[xi][i])+abs(coor[yi][k]-coor[yi][j]);
if(temp<dp[i][j])
{
dp[i][j]=temp;
s[i][j]=k;
}
}
}
printf("%d\n",dp[1][n]);
}
}