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}
你的任务是替一家叫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; }
相关文章推荐
- uva 10003- Cutting Sticks (记忆化搜索)
- uva 10003 Cutting Sticks
- UVA 10003 - Cutting Sticks
- UVA 10003 - Cutting Sticks
- 【UVa 10003】【区间DP】Cutting Sticks【有一个长为L的木棍,木棍中间有n个切点。每次切割的费用为当前木棍的长度。求切割木棍的最小费用。】
- UVA - 10003 Cutting Sticks (区间DP)
- UVa 10003 Cutting Sticks (DP)
- Uva-10003-Cutting Sticks
- uva_10003 Cutting Sticks
- UVa 10003 Cutting Sticks 解题源码
- UVA 10003 Cutting Sticks
- UVA 10003 - Cutting Sticks (区间DP)
- uva 10003 Cutting Sticks(区间DP)
- uva 10003 Cutting Sticks(区间DP)
- UVa10003 - Cutting Sticks
- UVA-10003 Cutting Sticks
- uva 10003 Cutting Sticks
- UVa 10003:Cutting Sticks(DP)
- UVa 10003 - Cutting Sticks
- Uva 10003 Cutting Sticks (区间dp)