首页 > 代码库 > Uva 10003-Cutting Sticks(区间DP)

Uva 10003-Cutting Sticks(区间DP)

题目链接:点击打开链接

题意: 一根长度为L 的木棒,要求要切割n次,给出n次需要切割的位置,每次切割花费为当前段的总长度。求最小花费。

思路:。。一开始想了好久也没往区间DP那方面想QAQ。设 dp[i][j] 为切割[i,j] 区间的最小花费,状态转移方程为 dp[i][j]=max(dp[i][k-1]+dp[k+1][j]+a[j+1]-a[i-1]);

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cctype>
#include <vector>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define maxn 1005
#define _ll __int64
#define ll long long
#define INF 0x3f3f3f3f
#define Mod 1<<40+10
#define pp pair<int,int>
#define ull unsigned long long
using namespace std;
int a[55],L,dp[55][55],n;
int dfs(int l,int r)
{
	int& ans=dp[l][r];
	if(ans>=0)return ans;
	if(l==r) return ans=a[r+1]-a[l-1];
	if(l>r)return ans=0;
	ans=INF;
	for(int i=l;i<=r;i++)
		ans=min(ans,dfs(l,i-1)+dfs(i+1,r)+a[r+1]-a[l-1]);
	return ans;
}
int main()
{
	while(~scanf("%d",&L)&&L)
	{
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
			scanf("%d",&a[i]);
		a[0]=0;a[n+1]=L;
		memset(dp,-1,sizeof(dp));
		printf("The minimum cutting is %d.\n",dfs(1,n));
	}
	return 0;
}

Uva 10003-Cutting Sticks(区间DP)