![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
区间dp
big up
这个作者很懒,什么都没留下…
展开
-
uva10003
题目大意: 有一根长度为l的木棍,木棍上面有m个切割点,每一次切割都要付出当前木棍长度的代价,问怎样切割有最小代价。思路: 第一次做区间dp的问题,学到了很多,有点类似分治法的样子。 枚举区间长度,区间起点,分成两个区间的那个点,找出最小的。然后不断的递推。代码:#include <iostream>using namespace std;#include <cstring>#incl原创 2016-01-22 17:30:38 · 500 阅读 · 1 评论 -
uva348 区间DP
题目大意: 最优矩阵链成思路: 让矩阵相乘的乘数最少代码:#include <iostream>using namespace std;#include <stdio.h>#include <cstring>#define INF 1000000000int num[15][2];int dp[15][15];int a[15][15];void print(int l,int r原创 2016-02-25 20:24:39 · 212 阅读 · 0 评论 -
uva104 (DP + floyd)
题目大意: 给你两两国家之间的汇率,要求你从任何一个国家出发,身上带着1(单位不明),然后回到这个国家时,身上的钱能够> 1.01.并且如果这样的路径有多条的话,希望的到的是最短的路径,并且还有要求你输出这个最短的路径。思路: 利用DP去求出从i到j中间经过l个国家后所获得的金钱。 那么dp[i][j][1]表示的是从i到j国家之间的汇率, 所以dp[i][j][l] = max(dp[i]原创 2016-03-13 14:54:39 · 350 阅读 · 0 评论 -
uva10304 区间DP
题目大意: 求二叉搜索树的最小的代价。 代价 = 节点的值 * 到根节点的边数思路: dp[i][j]表示从i到j需要付出的最小的代价 分成两个区间 分界点为根节点,根节点左边是左子树,右边是右子树 k不用算进去 因为是根节点不用付出任何代价 左子树付出的代价 + 右子树付出的代价 由于根节点使得左右子树的深度增加了1 dp[i][j] = min(dp[i][k - 1] + dp原创 2016-02-28 21:13:16 · 201 阅读 · 0 评论 -
uvalive4731
题目大意: 给出数字的个数n以及要分成的组数w。 然后给出各个数字的概率, 求最小的数学期望。思路: DP。因为要求最小的数学期望所以概率大的应该摆在前面,所以要先排序一下。 dp[i][j]表示的是第i组前j个数字可以得到的最小的数学期望。代码:#include <iostream>using namespace std;#include <cstring>#include <st原创 2016-04-18 16:41:58 · 443 阅读 · 0 评论 -
uvalive3363
题目大意: 压缩字符串。 例如 letsgogogo = lets3(go) letsgogogo的长度是10 lets3(go)的长度是9 3(go)的长度计算:每个字符算1的长度 所以这是5思路: 字符号DP。 区间DP。 dp[i][j]表示在从i到j可以达到的最短的产地故代码:#include <iostream>using namespace std;#include原创 2016-04-20 17:57:09 · 258 阅读 · 0 评论 -
uvalive4394(区间dp)
题目大意: 给出两个字符串;每次可以选择第一个字符串的一个区间,全部刷成某一个字母; 问最少刷几次可以刷成第二个串;思路: dp[i][j]是区间(i,j)最少需要刷多少此。 如果a[i] == a[k] 那么dp[i][j] = min(dp[i][j],dp[i + 1][k] + dp[k + 1][j]) 因为i 和k相等的话,那么k就不需要在刷了,所以分成这两个区间算的话会是最原创 2016-04-21 18:46:42 · 428 阅读 · 0 评论