码迷,mamicode.com
首页 > 其他好文 > 详细

Uva 10003-Cutting Sticks(区间DP)

时间:2014-12-04 01:10:36      阅读:170      评论:0      收藏:0      [点我收藏+]

标签: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)

标签:dp

原文地址:http://blog.csdn.net/qq_16255321/article/details/41707633

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!