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));
	}
}
posted @ 2026-03-25 13:21  peter_shen  阅读(3)  评论(0)    收藏  举报