标签:des style blog http io ar color os sp
Description
| Cutting Sticks |
It is easy to notice that different selections in the order of cutting can led to different prices. For example, consider a stick of length 10 meters that has to be cut at 2, 4 and 7 meters from one end. There are several choices. One can be cutting first at 2, then at 4, then at 7. This leads to a price of 10 + 8 + 6 = 24 because the first stick was of 10 meters, the resulting of 8 and the last one of 6. Another choice could be cutting at 4, then at 2, then at 7. This would lead to a price of 10 + 4 + 6 = 20, which is a better price.
Your boss trusts your computer abilities to find out the minimum cost for cutting a given stick.
The next line consists of n positive numbers ci ( 0 < ci < l) representing the places where the cuts have to be done, given in strictly increasing order.
An input case with l = 0 will represent the end of the input.
100 3 25 50 75 10 4 4 5 7 8 0
The minimum cutting is 200. The minimum cutting is 22.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<queue>
#include<vector>
#include<set>
using namespace std;
#define INF 1<<30
int dp[1005][1005],l,n,stick[1005];
int dfs(int x,int y)
{
if(dp[x][y]!=-1)
return dp[x][y];
if(x+1==y)
{
dp[x][y]=0;
return dp[x][y];
}
dp[x][y]=INF;
for(int i=x+1;i<y;i++)
{
int temp=dfs(x,i)+dfs(i,y)+stick[y]-stick[x];
if(temp<dp[x][y])
dp[x][y]=temp;
}
return dp[x][y];
}
int main()
{
while(scanf("%d",&l),l)
{
memset(stick,0,sizeof(stick));
memset(dp,-1,sizeof(dp));
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&stick[i]);
stick[0]=0,stick[n+1]=l;
printf("The minimum cutting is %d.\n",dfs(0,n+1));
}
return 0;
}
dp[i][j],表示从i到j切割花费的最小代价。
标签:des style blog http io ar color os sp
原文地址:http://www.cnblogs.com/a972290869/p/4107353.html