本文主要是介绍uva 10003 Cutting Sticks,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意:有根木头,长度l,对它切n刀,分别在c1,c2....cn位置。费用等于你当前切的木头的长度。问你最少的费用是多少。
定义dp(be,end)为从切点be到end的最少费用。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=60;
int a[N],map[N][N],dp(int,int);
bool vis[N][N];
int main()
{int n;while(scanf("%d",&n)!=EOF){if(n==0) break;memset(a,0,sizeof(a));memset(map,0,sizeof(map));memset(vis,0,sizeof(vis));int m;scanf("%d",&m);for(int i=1;i<=m;i++){scanf("%d",&a[i]);}m++;a[m]=n;printf("The minimum cutting is %d.\n",dp(0,m));}return 0;
}
int dp(int be,int end)
{if(vis[be][end]) return map[be][end];else if(end-be==1) {vis[be][end]=1;return 0;}{int imin=1<<30;for(int i=be+1;i<end;i++){int temp=dp(be,i)+dp(i,end)+a[end]-a[be];imin=min(imin,temp);}vis[be][end]=1;map[be][end]=imin;return imin;}
}
这篇关于uva 10003 Cutting Sticks的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!