摘要:
POJ1179 区间DP 很简单的思考过程,把所有的东西看成一个圆,枚举去掉每一个边的情况。然后每一种都是一条链的区间DP。 l == r : dp[l][r] = num[l]; l != r : dp[l][r] = max(dp[l+1][r],dp[l][r-1]); 但是需要注意的是,这题 阅读全文
摘要:
POJ1159 求一个字符串s变成回文字符串最少需要多少个字符。 1.从后往前推 dp[l][r]表示从l到r会有最少需要多少个字符 那么最终的答案应该是 dp[0][n-1]。 状态转移方程应该是: dp[l] == dp[r] : dp[l][r] = dp[l+1][r-1]//因为前后两端相 阅读全文
摘要:
线性DP(1) 1.LIS 问题:给定一个长度为n的数组,找出一个最长的单调递增子序列。 例如:{5,6,7,4,2,8,3}最长的是{5,6,7,8},长度为n。 例题: HDU - 1257 该题就是给出一个序列,然后求最少可以有多少个单调下降的序列。 每一个下降序列都有一个最小值Ai,每一个A 阅读全文
摘要:
背包DP(2) 1.多重背包 题目:n种物品,m的背包。第i种物品,最多有s[i]件,每件体积v[i],价格是w[i]。求解选择哪些物品放入背包,不超过背包,价值最大。输出最大价值。 (1)朴素算法 不如这样想,取s[i]件物品,就是s[i]件一样的物品。即转换为01背包。 令k1为s[i]的求和 阅读全文
摘要:
背包问题 1.01背包 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 Hdu 2602 Bone Collector 样例输入: 5 10 1 2 3 4 5 5 4 3 2 1 样例输出: 阅读全文
摘要:
题解 F 假设每一个点为ai,每个人的蛋糕为x 把每个点ai放在数轴上,不难发现,|ai-x|为x到ai的距离。任取两个值ai,aj,发现x只要是 ai到aj上的任意一个点即可。 答案就是若干对aj-ai求和。 int a[N]; int main() { int n; cin>>n; for(in 阅读全文
摘要:
数论(1) 1.埃氏筛 素数的n倍一定不是素数,所以就打表,筛选素数。 const int maxn = 1e6+10; bitset<maxn> isprime; void init(int n){ isprime.set();//清空 isprime[0] = isprime[1] = 0; i 阅读全文
摘要:
最短路径算法(3) 1.dijkstra的局限性 之前在dijkstra的证明当中,我们认为所有的边权为正,但如果为负是否还是正确的呢? 显然这是错误的。 我们认为每次迭代的离源点最近的路为最短路。这是因为之后的路不会更短了,毕竟后面的路都是正的。路径只会变长。 但是如果存在负的边,这就不行了,之后 阅读全文
摘要:
最短路算法(2) 1.基于BFS的无权图最短路径 如果是无权图,我们遍历一张图就可以得到一棵树,很显然,每个节点的深度就是它的的最短路径长度。 BFS搜图的过程类似于树的层次遍历。也就是说我们在BFS遍历时就可以得到最短路径。而不是完全搜索整个图。但是我们需要一个变量来记录遍历的深度。 2.有权图的 阅读全文
摘要:
最短路算法(1) 介绍floyd: 用于求全源最短路径的算法,这个代码非常简短好记,这里会记录两种应用。 1.简单模板优化以及处理连通性问题 这个算法可以用来求传递闭包(注释中有)。 代码如下: const int N = 100+50; const int INF = 500;//这个不可以太大, 阅读全文