uva10003(有点迷糊的思考)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/qq_39562952/article/details/85106373