题目大意:将一段长为L的木棒在给定的n个切割点切开,每切一次的花费等于当前木棒的长度。求切成n+1段的最小花费。
题目分析:区间DP。定义dp(i,j)表示切割区间i~j的花费,则 f(i,j)=min(f(i,k)+f(k,j))+dist(i,j)。时间复杂度为n3。
代码如下:
# include<iostream> # include<cstdio> # include<cstring> # include<algorithm> using namespace std; const int INF=100000000; int a[55],dp[55][55],n; void DP() { for(int l=0;l<=n+1;++l){ for(int i=0;i+l<=n+1;++i){ int r=i+l; dp[i][r]=INF; if(l==0)///l为0说明现在是第一刀。 dp[i][r]=a[n+1]-a[0]; if(l==1)///l为1说明现在不用切割。 dp[i][r]=0; for(int k=i+1;k<r;++k) dp[i][r]=min(dp[i][r],dp[i][k]+dp[k][r]+a[r]-a[i]); } } } int main() { int l; while(scanf("%d",&l)&&l) { scanf("%d",&n); a[0]=0; for(int i=1;i<=n;++i) scanf("%d",a+i); a[n+1]=l; sort(a,a+n+2); DP(); printf("The minimum cutting is %d.\n",dp[0][n+1]); } return 0; }
时间: 2024-10-11 01:04:28