UVA - 10304Optimal Binary Search Tree(递推)
2014-08-09 22:15
393 查看
题目:UVA - 10304Optimal Binary Search Tree(递推)
题目大意:给出一组数,e1 < e2 < ... < en,现在要求将这些数组成一棵二叉搜索树,并且使得sum (ei * cost(ei))最小。cost(ei)表示ei到到根节点之间有多少条边。
解题思路:首先二叉搜索树要满足左节点小于根节点,右节点大于根节点。因此对于e1 < e2 < ... < en这样一组数,我们只要枚举根节点的位置ek,将这个序列分成左右子树两部分(e1,e2..ek-1) (ek+ 1, ek + 2, ..en)。然后找到最优的根节点。而且对于两个子树,也是同样的做法(最优子结构)。
状态转移方程:dp【i】【j】 = MIN (dp【i】【k - 1】 + dp【k +1】【j】 + num【k - 1】 - num【i - 1】 + num【j】 - num【k】) 。
代码:
题目大意:给出一组数,e1 < e2 < ... < en,现在要求将这些数组成一棵二叉搜索树,并且使得sum (ei * cost(ei))最小。cost(ei)表示ei到到根节点之间有多少条边。
解题思路:首先二叉搜索树要满足左节点小于根节点,右节点大于根节点。因此对于e1 < e2 < ... < en这样一组数,我们只要枚举根节点的位置ek,将这个序列分成左右子树两部分(e1,e2..ek-1) (ek+ 1, ek + 2, ..en)。然后找到最优的根节点。而且对于两个子树,也是同样的做法(最优子结构)。
状态转移方程:dp【i】【j】 = MIN (dp【i】【k - 1】 + dp【k +1】【j】 + num【k - 1】 - num【i - 1】 + num【j】 - num【k】) 。
代码:
#include <cstdio> #include <cstring> const int N = 255; const int INF = 0x3f3f3f3f; int v ; int num ; int dp ; int n; int Min (const int a, const int b) { return a < b? a: b; } int main () { while (scanf ("%d", &n) != EOF) { num[0] = 0; for (int i = 1; i <= n; i++) { scanf ("%d", &v[i]); num[i] = num[i - 1] + v[i]; } for (int i = 1; i <= n; i++) dp[i][i] = 0; int left, right; for (int l = 1; l < n; l++) for (int i = 1; i + l <= n; i++) { dp[i][i + l] = INF; for (int j = i; j <= i + l; j++) { if (j != i) left = dp[i][j - 1] + num[j - 1] - num[i - 1]; else left = 0; if (j != i + l) right = dp[j + 1][i + l] + num[i + l] - num[j]; else right = 0; dp[i][i + l] = Min (dp[i][i + l], left + right); } } // printf ("%d %d\n", INF, 1<<30); printf ("%d\n", dp[1] ); } return 0; }
相关文章推荐
- UVa 1645 - Count(递推)
- UVA 12673 Erratic Expansion 奇怪的气球膨胀 (递推)
- UVA - 348Optimal Array Multiplication Sequence(递推)
- UVA10870递推关系(矩阵乘法)
- UVa 11137 - Ingenuous Cubrency (递推 DP 多重背包 )
- uva 11464 Even Parity 递推
- CSU-ACM2017暑期训练3-递推与递归I - Erratic Expansion UVA - 12627
- uva11464(递推关系)
- Uva 11300 Spreading the Wealth(递推,中位数)
- uva 12730 Skyrk's Bar 递推
- uva 10870 递推关系矩阵快速幂模
- UVa12034 Race 递推
- UVA10081-Tight Words(递推)
- 递推关系( Recurrences, UVa 10870)(矩阵快速幂)
- 递推DP UVA 1291 Dance Dance Revolution
- Uva 10253 - Series-Parallel Networks 解题报告(递推)
- Uva 10079 - Pizza Cutting 解题报告(递推)
- 递推DP UVA 607 Scheduling Lectures
- uva10271 - Chopsticks(递推)
- uva 10328 - Coin Toss 投硬币(dp递推,大数)