【UVa 10003】【区间DP】Cutting Sticks【有一个长为L的木棍,木棍中间有n个切点。每次切割的费用为当前木棍的长度。求切割木棍的最小费用。】
2016-11-12 16:59
555 查看
传送门:http://vjudge.net/contest/141412#problem/D (密码:cd)
题意:有一个长为L的木棍,木棍中间有n个切点。每次切割的费用为当前木棍的长度。求切割木棍的最小费用。
思路:
d(i, j)表示切割第i个切点到第j个切点这段所需的最小费用。则有d(i, j) = min{d(i, k) + d(k, j)} + a[j] - a[i]; ( i < k < j ) 最后一项是第一刀的费用。
时间复杂度为O(n^3)
这题当然也可以像石子合并那题一样用四边形不等式合并
代码:
题意:有一个长为L的木棍,木棍中间有n个切点。每次切割的费用为当前木棍的长度。求切割木棍的最小费用。
思路:
d(i, j)表示切割第i个切点到第j个切点这段所需的最小费用。则有d(i, j) = min{d(i, k) + d(k, j)} + a[j] - a[i]; ( i < k < j ) 最后一项是第一刀的费用。
时间复杂度为O(n^3)
这题当然也可以像石子合并那题一样用四边形不等式合并
代码:
#include <bits/stdc++.h> using namespace std; #define mst(ss,b) memset(ss,b,sizeof(ss)); const int inf=0x3f3f3f3f; const int N=55; int c , dp ; int main(){ int n, len; while(~scanf("%d %d", &len, &n) && len){ for(int i=1; i<=n; i++)scanf("%d", &c[i]); c[0]=0; c[n+1]=len; for(int d=2; d<=n+1; d++){//枚举长度,d=l-r for(int l=0; l+d<=n+1; l++){ //枚举l,r int r=l+d; int& ans=dp[l][r]=inf; for(int k=l+1; k<r; k++){ //枚举切割点 ans = min(ans, dp[l][k]+dp[k][r]+c[r]-c[l]); } } } printf("The minimum cutting is %d.\n", dp[0][n+1]); } return 0; }
相关文章推荐
- uva 10003 一根木棍上有n个切割点 4000 每次选一个点切割,求总切割费用最小 区间DP
- UVA10003固定点切木棍,怎么切使得每次切之前的木棍长度总和最小
- 【解题报告】uva10003_Cutting Sticks(切割木棍, dp)
- 例题9-9 UVA 10003 Cutting Sticks 切木棍(区间dp)
- uva 10003 Cutting Sticks (区间dp)
- uva 10003 Cutting Sticks(区间DP)
- UVA 10003 cuting sticks 切木棍 (区间dp)
- uva 10003 Cutting Sticks 简单区间dp
- uva10003 - Cutting Sticks(DP,区间)
- UVA-10003 Cutting Sticks (区间DP)
- UVa 10003 - Cutting Sticks(白书,区间DP)
- UVA 10003 Cutting Sticks(区间dp)
- UVA 10003 Cutting Sticks(区间dp)
- UVA 10003 Cutting Sticks 切木棍 dp
- UVA 10003 Cutting Sticks 区间DP
- UVA 10003 Cutting Sticks(区间DP)
- uva 10003 Cutting Sticks (区间dp)
- UVa 10003 - Cutting Sticks 区间dp
- uva 10003 Cutting Sticks(区间DP)
- uva10003 - Cutting Sticks(区间dp)