您的位置:首页 > 其它

uva 10003 Cutting Sticks

2015-02-27 22:08 260 查看
题意:

你的任务是替一家叫Analog Cutting Machinery (ACM)的公司切割木棍。
切割木棍的成本是根据木棍的长度而定。 而且切割木棍的时候每次只切一段。


很显然的,不同切割的顺序会有不同的成本。 例如:有一根长10公尺的木棍必须在第2、4、7公尺的地方切割。 这个时候就有几种选择了。你可以选择先切2公尺的地方,然后切4公尺的地方,最后切7公尺的地方。这样的选择其成本为:10+8+6=24。
因为第一次切时木棍长10公尺,第二次切时木棍长8公尺,第三次切时木棍长6公尺。 但是如果你选择先切4公尺的地方,然后切2公尺的地方,最后切7公尺的地方,其成本为:10+4+6=20,这成本就是一个较好的选择。


你的老板相信你的电脑能力一定可以找出切割一木棍所需最小的成本。

思路:典型的动态规划题目,有点像矩阵链乘问题,找到状态转移公式就好了dp[i][j]=max{dp[i][k]+dp[k][j]+len[j]-len[i]|i<k<j}

/***********************************************
 * Author: fisty
 * Created Time: 2015/2/15 19:06:18
 * File Name   : uva10003.cpp
 *********************************************** */
#include <iostream>
#include <cstring>
#include <deque>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <algorithm>
using namespace std;
#define Debug(x) cout << #x << " " << x <<endl
#define Memset(x, a) memset(x, a, sizeof(x))
const int INF = 0x3f3f3f3f;
typedef long long LL;
typedef pair<int, int> P;
#define FOR(i, a, b) for(int i = a;i < b; i++)
#define MAX_N 100
int arr[MAX_N];
int dp[MAX_N][MAX_N];

int main() {
    //freopen("in.cpp", "r", stdin);
    cin.tie(0);
    ios::sync_with_stdio(false);
    int L;
    while(cin >> L){
        int n;
        if(!L) break;
        cin >> n;
        for(int i = 1;i <= n; i++){
            cin >> arr[i];
        }
        arr[0] = 0; arr[n+1] = L;
        Memset(dp, 0);
        for(int p = 1; p <= n+1; p++){
            for(int i = 0;i <= n+1; i++){
                int j = i + p;
                int _min = INF;
                if(j > n+1) break;
                for(int k = i+1;k < j; k++){
                    _min = min(_min, dp[i][k] + dp[k][j]);
                }
                if(_min != INF) dp[i][j] = _min + arr[j] - arr[i];
            }
        }
        cout << "The minimum cutting is "<< dp[0][n+1]<<".\n";
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: