UVa 10003 - Cutting Sticks
来源:互联网 发布:程序员上班闲 编辑:程序博客网 时间:2024/06/05 02:04
题目:有一个长l的木头,切成n+1段,切割的代价是当前段长度,求最小代价和。
分析:dp,区间动态规划。石子合并的逆过程。
状态:设F(i,j)为从点i切到j长度的木头切割成对应的小段代价,则有转移方程:
F(i,j)= min(F(i,k)+F(k,j)+cost(i,j)) {其中 i < k < j };
这里注意,dp过程按区间大小递增顺序进行。
说明:注意边界条件,只有一小段时代价为0。
#include <iostream>#include <cstdlib>#include <cstring>using namespace std;int cut[55];int dp[55][55];int main(){int l,n;while (cin >> l >> n) {for (int i = 1 ; i <= n ; ++ i)cin >> cut[i];cut[0] = 0; cut[n+1] = l;//初始化,边界条件 for (int i = 0 ; i < 55 ; ++ i)for (int j = 0 ; j < 55 ; ++ j)dp[i][j] = 1000000;for (int i = 0 ; i <= n ; ++ i)dp[i][i+1] = 0;//区间dp for (int d = 2 ; d <= n+1 ; ++ d)for (int s = 0 ; s+d <= n+1 ; ++ s)for (int k = s+1 ; k < s+d ; ++ k)if (dp[s][s+d] > dp[s][k]+dp[k][s+d]+cut[s+d]-cut[s])dp[s][s+d] = dp[s][k]+dp[k][s+d]+cut[s+d]-cut[s];cout << "The minimum cutting is "<< dp[0][n+1] << "." << endl; }return 0;}
0 0
- UVa 10003 Cutting Sticks
- UVA 10003 - Cutting Sticks
- UVa 10003 - Cutting Sticks
- uva 10003 Cutting Sticks
- uva:10003 - Cutting Sticks
- UVa 10003 Cutting Sticks
- UVa 10003 Cutting Sticks
- UVa 10003 - Cutting Sticks
- UVA 10003 Cutting Sticks
- Uva - 10003 - Cutting Sticks
- UVa 10003 - Cutting Sticks
- UVa 10003 - Cutting Sticks
- UVA 10003 Cutting Sticks
- UVa 10003 Cutting Sticks
- UVa 10003 - Cutting Sticks
- Uva-10003-Cutting Sticks
- UVa:10003 Cutting Sticks
- UVA - 10003 Cutting Sticks
- 修改linux下命令提示行路径长度
- 轮廓的查找、表达、绘制、特性及匹配
- C++实现链表函数
- 如何阅读源代码
- Chapter 12 Concurrent Programming [《CSAPP》 笔记]
- UVa 10003 - Cutting Sticks
- Single Number问题
- RabbitMQ RPC
- Date日期处理
- Storm实战之Trident简介
- Maximum Subarray
- visual studio 注意点
- 文章中获取第一张图片作为文章缩略图
- struts 和servlet的关系