摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3709数位dp,练模板好题。。题目要求求出[x, y] 范围内的平衡数,平衡数定义为:以数中某个位为轴心,两边的数的偏移量为矩,数位权重,使得整个数平衡。当然,首先可以简化一下条件~,设Kp为以p为支点的平衡度;则 Kp = sum(di*(i-p)); 故△Kp = K(p+1) - Kp = -sum(di);记 ps = K0 (以0为支点的平衡度), s =sum(di);所以条件存在Kp == 0等价为 s|ps. 1 #include 2 #include 3 #include 4 #in...
阅读全文
摘要:1 int dfs(int i, int s, bool e) {2 if (i == -1) return s == target_s;3 if (!e && ~dp[i][s]) return dp[i][s];4 int res = 0;5 int u = e ? num[i] : 9;6 for (int d = first ? 1 : 0; d <= u; ++d)7 res += dfs(i-1, new_s(s, d), e&&d == u);8 return e ? res : dp[i][s] = res;9 }Vi...
阅读全文
摘要:http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=2103树型dp + 分组背包。 dp[u][V]表示 对于以根为u的子树、剩余pow为V(看作容量)时能得到的最优解,那么: 对于u的某一个状态dp[u][k]: 其子树vi有 size( dp[vi][j] ) 个状态,但仅有一个状态可以转移给 dp[u][k] ,所以必须以子树为单位分组。关于分组背包,详细请看: http://blog.csdn.net/nywsp/article/details/7737158 1 #include 2 #include 3 #inclu...
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=1029poj 2411 http://poj.org/problem?id=2411这个题目类属于状态压缩DP,对于状态压缩DP,其实最简单的理解就是把状态用比特位的形式表示出来,我们会在下面用例子来说明。假如现在我们在铺砖 位置(i, j), 并且假设之前的位置已经铺设好的了,在这个位置,我们的选择:1. 不用铺砖了,可能在(i-1, j)的时刻已经被竖着铺上了,然后考虑的是(i, j+1)2. 横铺砖,将(i, j+1)也铺上了,然后考虑的是(i, j+2)3. 竖着铺砖,(将i,j)和(i+
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4604想了半天,发现是LIS,O(nlgn)飘过。具体思路:预处理好以i为开头的(下面我用逆序输入,所以是以i为结尾的)LIS和LDS。 再枚举每个点找最优即可(注意不严格递增、减)。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #...
阅读全文
摘要:http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=1271因为盒子的方向是任意定的,所以把盒子的三个方向都存下来在dp会方便很多 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 9 struct Node10 {11 int x, y, z;12 }b[100];13 int n;14 15 bool cmp(const Node &a, const Node &b)16 {17 ...
阅读全文
摘要:http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=1494poj 1742 http://poj.org/problem?id=1742这题是一个部分背包,本来想过用二分的方法变成一个0-1背包,时间复杂度为(nlogV*V),但是还是超时了,所以要优化成(nV)的才能过 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 10 int dp[100005], cou[100...
阅读全文
摘要:EOJ 2743 http://acm.cs.ecnu.edu.cn/problem.php?problemid=2743本题为LIS:即Longest Increasing Sequence.(本题中严格递增)最长上升子序列(LIS)长度的O(nlogn)算法:(对状态转移时查找的优化) 用len[ i ]存放当前(需不断更新) 长度为 i 的上升子序列的末尾 的最小值, 注意到,len[]严格递增,可对其进行二分查找, 找到最大的i ,且满足len[ i ] 2 #include 3 #include 4 #include 5 #include 6 #include 7 ...
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=2064大致题意:给出一些物品的体积与体积上限,选出一些物品,使得物品总体积大于等于体积上限且差值最小,求出这个差值n 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 #include11 #include12 #include13 #include14 #include15 #include16 using namespace std;17 int a[21],nex
阅读全文
摘要:http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=2857一道典型dp,状态转移方程类似LCS。操作有三种:1修改一个字母,2删除一个字母,3插入一个字母。对于dp[i][j],能从如下状态转移而来: if(a[i] == b[j]) 不操作—— 对应状态dp[i-1][j-1]; else 操作1——a[i]改成b[j], 对应状态dp[i-1][j-1]+1; 操作2——删a[i], 对应状态dp[i-1][j]+1; 操作3——在a[i], a[i+1]间插入m,使 m = b[j], 对应状态...
阅读全文
摘要:EOJ 1186 http://acm.cs.ecnu.edu.cn/problem.php?problemid=1186题意:给定一棵树,选取一定的节点,相邻父子节点不可同时选取。 树型dp,不能简单地用并查集分组。 题解: http://blog.csdn.net/woshi250hua/article/details/7641589 1 //hdu 2 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 12 using namesp...
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=2144题意:给出n种物品以及m种材料,每种物品由不同材料制成,每种材料需要一定的资金(付钱后可无限用),求资金不超过给定p的情况下能造出的最多种类物品题目用二进制的方式表示物品由哪些材料构成,1表示选,0表示不选,使用时转化为十进制,过程以二进制为主。思路:记下每个物品的材料状态(二进制转化为十进制)(a[i]),在资金不超过限定的条件下,选取包含给出物品材料状态的某种状态。假设某物品的材料状态为1010,则所有包含其状态的情况,都可以制造出该物品(如1110,1111,1011),即如果没有资金
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=2112题意:给出时间上限,并给出每道题需要完成的时间以及得到的价值,求能得到的最大价值与01背包不同的是,这题的时间最大10^9,即容量为这么多,不能直接对容量DP,但发现每道题获得的价值有上限200,且n最大为100,就可以对价值进行DP,然后得到所有价值中时间小于等于给出最大时间的最大值即 dp[i]为获得价值为i需要花费的最短时间,转移方程为dp[i]=min{dp[i],dp[i-V]+t}; 选出{max(i)|dp[i] 2 #include 3 #include 4 #include
阅读全文
摘要:http://acm.cs.ecnu.edu.cn/problem.php?problemid=1027题意:给N种邮票,第 i 种邮票面值为c[i], 有amt[i]张, 问,用这些邮票,可以贴出多少面额不同的邮资。思路: 一看就是须装满的多重背包(参见lrj背包九讲)。只不过问的是有多少不同面值, 也即有多少种不同容量的背包能被装满。 如果改成这样问:给定一个面额,有多少种贴法,那就和 poj 1837 差不多了。 具体的: 把每个邮票看成一个容量为c[i]的物品,dp[i][j]表示第i个物品放完后容量为j的背包的状态, dp[i][j] = 0:未满,dp[i][j...
阅读全文
摘要:http://poj.org/problem?id=1836题意: 一队士兵排队,高低起伏。去掉最少的士兵,使得中间高两边低(单峰)。经典LIS,注意[1~n]的最优解并不一定在dp[n]中,故需预处理。 1 #include <iostream> 2 #include <stdio.h> 3 #include <string> 4 #include <string.h> 5 #include <stdlib.h> 6 #define EPS 1e-5 7 #define INF 0x3f3f3f 8 9 using namespac
阅读全文