1097: 木匠PIPI
记忆化搜索,dp自上而下
#include<bits/stdc++.h>
using namespace std;
int m,n;
const int N=1010;
int num[N];
int dp[N][N];
int fun(int l,int r){
//cout<<l<<" "<<r<<endl;
if(dp[l][r]!=-1){
return dp[l][r];
}
dp[l][r]=INT_MAX;
if(r==l||r==l+1){
return dp[l][r]=0;
}
else{
for(int i=l+1;i<r;i++){
dp[l][r]=min(dp[l][r],fun(l,i)+fun(i,r)+num[r]-num[l]);
}
return dp[l][r];
}
}
int main(){
while(scanf("%d%d",&m,&n)!=EOF){
memset(dp,-1,sizeof(dp));
num[0]=0;
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
}
num[n+1]=m;
sort(num+1,num+1+n);
printf("%d\n",fun(0,n+1));
}
}

浙公网安备 33010602011771号