题意:
给你一根木块,让你在n个点切块(不能改变顺序),使得总花费最小,看拿来切的那根木棍的长度。
代码:
#include <map> #include <set> #include <cmath> #include <queue> #include <stack> #include <cstdio> #include <vector> #include <iomanip> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define ll long long #define mod 1000000007 #define mem(a) memset(a,0,sizeof(a)) using namespace std; const int maxn = 50 + 5 , inf = 0x3f3f3f3f ; int a[maxn],dp[maxn][maxn]; const char *s="The minimum cutting is "; int main(){ int n,m; while(scanf("%d",&n)!=EOF&&n){ scanf("%d",&m); mem(a);mem(dp); a[0] = 0;a[m+1]=n; for(int i=1;i<=m;i++) scanf("%d",&a[i]); for(int i=1;i<=m+1;i++){//区间长度 for(int j=0;j+i<=m+1;j++){//区间起点 int p = i+j;//终点 int minn = inf; for(int k=j+1;k<p;k++){ int temp = dp[j][k]+dp[k][p]+a[p]-a[j]; if(temp<minn) minn = temp; } if(minn!=inf) dp[j][p] = minn; } } printf("%s%d.\n",s,dp[0][m+1]); } }