版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39562952/article/details/85106373
思路:这题跟矩阵链乘的思路一样,所以还是很好考虑的,只是有一点需要加两个切割点;
代码如下:
/*
求最优的切割顺序
最优子结构:dp[i][j]从i刀到j刀的最优切割顺序
子问题:哪一刀最后切,dp[i][k]+dp[k][j]|i<k<j
证明:因为最后一刀切的所有情况都被历遍到了,必定包含了最优解
*/
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 55
#define inf 1000000
int dp[maxn][maxn];
int num[maxn];
int main()
{
int l, n;
while (scanf("%d", &l), l)
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &num[i]);
}
num[0] = 0;//没有很想明白为什么要加这两刀
num[n+1] = l;
for (int i = 2; i < n+2; i++)//区间长度
{
for (int j = 0; j + i <= n+1; j++)//起点
{
int end = i + j;
dp[j][end] = inf;
for (int k = j+1; k < end; k++)//切割点
{
dp[j][end] = min(dp[j][end], dp[j][k] + dp[k][end] + num[end] - num[j]);
}
}
}
/*for (int i = 1; i <= n ; i++)
{
for (int j =1; j <= n; j++)
{
printf("%d ", dp[i][j]);
}
printf("\n");
}*/
printf("The minimum cutting is %d.\n", dp[0][n+1]);
}
return 0;
}