#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1002;
int dp[maxn][maxn];
int main(){
int L;//木棍长度
cin>>L;
int n;//割点个数
cin>>n;
int t[maxn];
t[0]=0;
for(int i=0;i<=L;++i){
for(int j=0;j<=L;++j){
dp[i][j]=INT_MAX;
}
}
for(int i=1;i<=n;++i){
cin>>t[i];
dp[t[i-1]][t[i]]=0;//俩个割点之间不用切割费用
}
t[n+1]=L;
dp[t[n]][t[n+1]]=0;
//区间dp以区间包含的割点数从小到大进行状态转移
for(int len=1;len<=n;++len){
for(int i=0;i<=n+1-len;++i){
for(int k=i+1;k<i+len+1;++k){
dp[t[i]][t[i+len+1]]=min(dp[t[i]][t[i+len+1]],dp[t[i]][t[k]]+dp[t[k]][t[i+len+1]]+t[i+len+1]-t[i]);
}
}
}
cout<<dp[0][L]<<endl;
system("pause");
return 0;
}
UVa 10003 切木棍(区间dp)
于 2022-05-16 21:42:24 首次发布