对于i到j之间我们要去除第k个人。
我们需要i-k之间所有的花费 加上 k-j之间所有的花费 加上 当前需要的花费
前面两部分花费我们dp早就求出了
当前需要的花费 我们是对于当前i到j这一部分,我们看作是i为头,j为尾,都是靠边的了。所以就是j-i+2
#include <iostream>
using namespace std;
int n,m;
int A[110];
int dp[110][110];
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>A[i];
}
A[0]=0;
A[m+1]=n+1;
for(int i=0;i<=m;i++)
{
dp[i][i+1]=0;
}
for(int k=2;k<=m+1;k++)//优先间距,因为我们间距越拆越小,先处理小的
{
for(int i=0;i+k<=m+1;i++)//出发点
{
int j=i+k;
int tmp=1e9+8;
for(int u=i+1;u<j;u++)
{
tmp=min(tmp,dp[i][u]+dp[u][j]);//找到最小的拆分方式
}
dp[i][j]=tmp+A[j]-A[i]-2;//A【j】-A【i】-2,因为假设两边都是到头的
}
}
cout<<dp[0][m+1]<<endl;
}