UVA 10003 - Cutting Sticks
2014-08-05 14:29
417 查看
这个题 真是让我调了n遍啊
思路很简单。 在一个 0---n+1 的棍子上, 有 n个节点, 要想获得最小的费用, 在切一下的时候 费用一定是 a【j】 - a【i】
所以现在 只需要 剩下的 0- i 和 j 到 n+1 这两段 的费用最小, 继续按照上面的思路走, 继续切。 所以就要求每一部分都要小而已。
最后一次遍历 两个端点 0 -- n+1 试一试每一个节点,找出最小值即可。
思路很简单。 在一个 0---n+1 的棍子上, 有 n个节点, 要想获得最小的费用, 在切一下的时候 费用一定是 a【j】 - a【i】
所以现在 只需要 剩下的 0- i 和 j 到 n+1 这两段 的费用最小, 继续按照上面的思路走, 继续切。 所以就要求每一部分都要小而已。
最后一次遍历 两个端点 0 -- n+1 试一试每一个节点,找出最小值即可。
#include <cstdio> #include <algorithm> #include <iostream> #include <cstring> #include <cmath> #include <cstdlib> #include <string> #include <map> #include <vector> #include <set> #include <queue> #include <stack> using namespace std; #define ll long long #define maxn 1000+10 #define INF 1<<30 int dp[maxn][maxn]={0}; int main (){ int len; while(scanf("%d",&len) && len){ int l[maxn] = {0}; int n; memset(dp,0,sizeof(dp)); scanf("%d",&n); for(int i = 1; i <= n; i++) scanf("%d",&l[i]); l[n+1] = len; for(int j= 2; j <= n+1; j++){ for(int i = j-1; i >= 0; i--){ int z = INF; for(int k = i+1 ; k < j ; k++){ z = min(dp[i][k] + dp[k][j] , z) + l[j] - l[i]; if(z != INF && dp[i][j] == 0) dp[i][j] = z; else if(z != INF && dp[i][j] != 0) dp[i][j] = min(dp[i][j] , z); } } } printf("The minimum cutting is %d.\n",dp[0][n+1]); } return 0; }
相关文章推荐
- UVA10003 Cutting Sticks
- UVA - 10003 - Cutting Sticks (区间DP)
- uva 10003 cutting sticks
- uva 10003 Cutting Sticks (动态规划:区间DP)
- UVA 10003 Cutting Sticks(区间DP)
- uva 10003 Cutting Sticks
- UVA-10003 Cutting Sticks 动态规划 找分界点k的动规
- UVA 10003 Cutting Sticks
- 例题9-9 UVa10003 Cutting Sticks(DP:矩阵链乘)
- uva 10003 Cutting Sticks 【区间dp】
- UVa 10003 Cutting Sticks
- UVa 10003 - Cutting Sticks
- [动态规划]UVA10003 - Cutting Sticks
- 【解题报告】uva10003_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