UVA 10003 - Cutting Sticks

來源:互聯網
上載者:User

標籤:style   color   os   strong   io   for   cti   ar   



  Cutting Sticks 
You have to cut a wood stick into pieces. The most affordable company, The Analog Cutting Machinery, Inc. (ACM), charges money according to the length of the stick being cut. Their procedure of work requires that they only make one cut at a time.

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.

Input The input will consist of several input cases. The first line of each test case will contain a positive number l that represents the length of the stick to be cut. You can assume l < 1000. The next line will contain the number n (n < 50) of cuts to be made.

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.

Output You have to print the cost of the optimal solution of the cutting problem, that is the minimum cost of cutting the given stick. Format the output as shown below.

Sample Input 
100325 50 751044 5 7 80

Sample Output 
The minimum cutting is 200.The minimum cutting is 22.


經典的dp吧=。=,看懂的,不是自己想出來的。

區間dp:枚舉區間長度進行dp

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<limits.h>using namespace std;const int maxn= 1000+10;int dp[maxn][maxn];int a[maxn];int main(){    int len,n;    while(cin>>len&&len)    {        cin>>n;        for(int i=1;i<=n;i++)            cin>>a[i];        a[0]=0;        a[++n]=len;//可用的長度        memset(dp,0,sizeof(dp));        for(int l=2;l<len;l++)//枚舉長度        {            for(int i=0;i+l<=n;i++)            {                int j=i+l;                dp[i][j]=INT_MAX;                for(int k=i+1;k<j;k++)//枚舉中間斷點k                    dp[i][j]=min(dp[i][k]+dp[k][j]+a[j]-a[i],dp[i][j]);            }        }        cout<<"The minimum cutting is "<<dp[0][n]<<"."<<endl;    }    return 0;}

。。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.