
动态规划
文章平均质量分 77
even_bao
这个作者很懒,什么都没留下…
展开
-
【hdu 4374】One Hundred Layer
【题目链接】 点击打开链接【算法】 不难看出,这题可以用动态规划来解决 f[i][j]表示第i行第j列能够取得的最大分数 则如果向右走,状态转移方程为f[i][j]=max{f[i-1][k]+a[i][k]+a[i][k+1]+...+a[i][j]}(i-T<=k<=j) 如果向左走,则状态转移方程...原创 2018-02-12 08:58:53 · 312 阅读 · 0 评论 -
【HDU 1561】 The More,The better
【题目链接】 点击打开链接【算法】 树形背包 注意是一棵森林【代码】 #include<bits/stdc++.h>using namespace std;#define MAXN 210int i,n,m,tot,x;int head[MAXN],val[MAXN],f[MAXN][MAX...原创 2018-05-17 22:24:58 · 120 阅读 · 0 评论 -
【ZJOI 2006】 物流运输
【题目链接】 点击打开链接【算法】 令cost(i,j) = 第i天到第j天走相同的路线,路线长度的最小值 那么,只需筛选出第i天到第j天可以装卸货物的码头,然后将这些码头之间连边,跑弗洛伊德(或其它最短路算法),即可 然后,我们用f[i]表示前i天,总成本最小是多少,显然有 : ...原创 2018-05-11 21:10:22 · 156 阅读 · 0 评论 -
【BZOJ 1233】 干草堆
【题目链接】 点击打开链接【算法】 这题有一个性质 : 位于顶层的干草堆可以满足宽度最小且高度最高 根据这个性质,用单调队列优化DP,即可【代码】 #include<bits/stdc++.h>using namespace std;#define MAXN 100010int i,n,head,tail;in...原创 2018-05-12 09:40:45 · 344 阅读 · 0 评论 -
【HNOI2004】 打鼹鼠
【题目链接】 点击打开链接【算法】 动态规划 f[i]表示上一次打了第i只鼹鼠,所能打死的最多的鼹鼠数量【代码】 #include<bits/stdc++.h>using namespace std;#define MAXM 10010int i,j,n,m,ans;int t[MAXM],x[MA...原创 2018-05-05 22:22:43 · 266 阅读 · 0 评论 -
【Beijing WC2012】 冻结
【题目链接】 点击打开链接【算法】 dist[i][j]表示到达i号城市,使用了j次魔法,所用时间的最小值 那么,dist[i][j]可以转移到dist[k][j+1]和dist[k][j],一边spfa一边dp,即可【代码】 #include<bits/stdc++.h>using namespace st...原创 2018-05-19 11:40:24 · 238 阅读 · 0 评论 -
【HAOI 2008】 硬币购物
【题目链接】 点击打开链接【算法】 此题是一道好题! 首先,我们发现 : 付款方法数 = 不受限制的方法数 - 受限制的方法数 那么,我们怎么求呢? 我们用dp求出不受限制的方法数(f[i]表示买i元的东西,不受硬币限制,有多少种方案),只需用01背包的 方法就可以了,实现非常简单 ...原创 2018-05-06 22:41:44 · 336 阅读 · 0 评论 -
【HDU 2196】 Computer
【题目链接】 点击打开链接【算法】 我们知道,一棵树上离某个节点最远的节点,可能是经过它的祖先,再到那个祖先的某个孩子,或者,是它的那颗子树中,离它最远的一个节点,就不难想到以下算法 : 第一遍DFS,搜出每个节点的子树中离它距离最远的孩子的距离和所经过的儿子,离它次远的孩子的距离和所经过的儿子 第二遍DFS,树形DP...原创 2018-05-13 22:47:03 · 97 阅读 · 0 评论 -
【POJ 3107】 Godfather
【题目链接】 点击打开链接【算法】 这题描述有些繁琐,先简化一下题意 : 对于一棵无根树,删除一个节点,使得其余的联通块中,最大的联通块最小 那么,这题就很好做了 对这棵树进行一遍DFS,求出每个节点为根的子树的大小(记为size),再求出删除节点后,子树中最大的联通块的大小(记为mx) 那么,删除一个点后(...原创 2018-05-13 22:56:22 · 103 阅读 · 0 评论 -
【POJ 1155】TELE
【题目链接】 点击打开链接【算法】 树形DP f[i][j]表示以i为根的子树中,选了j个叶子节点,所能带来的最大收益 不难发现这就是一个经典的背包问题,不过是在树上做背包罢了 最后,判断f[1][i]是否大于等于0,输出最大的i【代码】 #include <a...原创 2018-05-13 23:00:50 · 182 阅读 · 0 评论 -
【AHOI2009】中国象棋
【题目链接】 点击打开链接【算法】 动态规划 f[i][j][k]表示前i行,有j列放了1个,有k列放了两个 分六种情况讨论即可【代码】 #include<bits/stdc++.h>using namespace std;#define MAXN 110const long long MO...原创 2018-04-28 19:05:01 · 451 阅读 · 0 评论 -
【ZJOI 2008】 生日聚会
【题目链接】 点击打开链接【算法】 动态规划 f[i][j][x][y]表示当前选了i个男生,j个女生,男生与女生差最大为x,女生与男生差最大为y的方案数 转移很显然,笔者不再赘述【代码】 #include<bits/stdc++.h>using namespace std;#define ...原创 2018-05-07 22:08:34 · 152 阅读 · 0 评论 -
5月19日省中提高组题解
【Problem A】 Square【题意】 给一个n * n的01矩阵,要求一个最大的全1正方形 N <= 1000 【题解】 朴素的做法是先求二维前缀和,然后暴力找最大的正方形子矩阵,时间复杂度 : O(n^3) 期望得分 : 80 考虑优化,我们发现如果有边长为n的正方形,就一定有边长为(n - 1)的正方形,因此,可以先二分边长d,...原创 2018-05-25 22:28:14 · 185 阅读 · 0 评论 -
【HDU 1520】 Anniversary Party
【题目链接】 点击打开链接【算法】 树形DP 令f[i][0]表示 : 以i为根的子树中,若i不参加宴会,所能获得的最大愉悦值 f[i][1]表示 : 以i为根的子树中,若i参加宴会,所能获得的最大愉悦值 那么,如果i不参加宴会,它的下属就可以参加宴会,也可以不参加宴会,因此 : f[i][0]...原创 2018-05-15 20:44:12 · 119 阅读 · 0 评论 -
【POJ 2152】 Fire
【题目链接】 点击打开链接【算法】 同样是树形DP,但是比较难,笔者做这题看了题解 令f[i][j]表示在以i为根的子树中 1.在以i为根的子树中建一些消防站 2.在节点j必须建一个消防站 3.以i为根的子树中,每个节点在满足距离不超过D的前提下,选一个子树内的节点或节点j作...原创 2018-05-15 21:04:45 · 184 阅读 · 0 评论 -
【POJ 3140】 Contestants Division
【题目链接】 点击打开链接【算法】 树形DP ans = min{ | total - 2 * sum[k] | } (sum为以k为根的子树的权值和) 【代码】 #include <algorithm>#include <bitset>#include <cctype>...原创 2018-05-15 21:08:55 · 189 阅读 · 0 评论 -
【SCOI 2003】 严格n元树
【题目链接】 点击打开链接【算法】 f[i]表示深度小于等于i的严格n元树 显然,一棵深度小于等于i的严格n元树,就是一个根节点,下面有n棵子树,而每棵子树有f[i-1]种形态,根据乘法原理, 可知f[i] = f[i-1] ^ n 那么最后f[d] - f[d-1]就是答案 注意要用高精...原创 2018-05-15 21:19:49 · 224 阅读 · 0 评论 -
【POJ 1947】 Rebuilding Roads
【题目链接】 点击打开链接【算法】 f[i][j]表示以i为根的子树中,最少删多少条边可以组成j个节点的子树 树上背包,即可 【代码】 #include <algorithm>#include <bitset>#include <cctype>#include <cer...原创 2018-05-16 19:53:44 · 199 阅读 · 0 评论 -
【SCOI 2009】 Windy数
【题目链接】 点击打开链接【算法】 数位DP,注意处理前导零的情况【代码】 #include<bits/stdc++.h>using namespace std;#define MAXL 15int n,m;int dp[MAXL][10],a[MAXL];template <typename T> ...原创 2018-04-26 20:43:30 · 148 阅读 · 0 评论 -
【JSOI 2007】祖玛
【题目链接】 点击打开链接【算法】 f[i][j]表示第i段到第j段,最少需要多少次全部消除 那么,当color[i] = color[j]时 : 若s[i] + s[j] > 2,根据题目中所说的“连锁反应”,很容易得到f[i][j] = f[i+1][j-1] 若...原创 2018-05-10 20:55:33 · 365 阅读 · 0 评论 -
【USACO 2006 November Gold】Corn Fields
【题目链接】 点击打开链接【算法】 状压DP【代码】 #include<bits/stdc++.h>using namespace std;#define MAXN 12#define MOD 100000000int M,N,i,j,k,ans,state;int ST[MAXN+1][(1<<12)+1],f[MAXN...原创 2018-02-12 18:09:43 · 434 阅读 · 0 评论 -
【扬中集训Day6T1】 白日梦
【题目描述】 白日梦(daydream.c/cpp/pas)时间限制: 1 s 空间限制: 256 MB题目描述 SR需要相当大的睡眠量 某日,他做了一个奇怪的梦,他梦见自己成为了怪物猎人,为了狩猎,他要去一个岛上住N+1天(编号为0到N)。这个岛位于太平洋中心,每天要么是晴天,要么刮台风。他到达岛的第0天是晴天。然后对于第i天,假如是晴天,那么有P(0<p&...原创 2018-02-14 22:28:19 · 378 阅读 · 0 评论 -
【NOIP16提高组】换教室
【题目链接】 点击打开链接 【算法】 概率DP 先跑一遍floyed,求出每个教室之间的最短路径,存在数组dist[][]中,时间复杂度O(V^3) 设计状态,f[i][j][k]表示当前选到第i个教室,已经选了j个教室,当前这个教室选不选(0..1) 那么,状态转移方程是什么呢? 假设当...原创 2018-02-15 14:37:09 · 475 阅读 · 0 评论 -
【hdu 5418】 Victor and world
【题目链接】 点击打开链接【算法】 状压DP f[i][S]表示走的最后一步在i,状态为S 于是我们可以用最短路径 + 状压DP解决此题,由于不存在负边,所以可以用dijkstra+堆优化【代码】 #include<bits/stdc++.h>using namespace std;#define MA...原创 2018-02-12 11:51:47 · 241 阅读 · 0 评论 -
【NOIP2014】 联合权值
【题目链接】 点击打开链接【算法】 如果(u,v)的距离为2,那么有两种可能 : 1.u和v为祖孙关系 2.u和v为兄弟关系 树形DP即可,详见代码【代码】 #include<bits/stdc++.h>using namespace std;#define MAXN 200000...原创 2018-02-22 15:38:49 · 238 阅读 · 0 评论 -
【USACO】 Balanced Lineup
【题目链接】 点击打开链接【算法】 这是一道经典的最值查询(RMQ)问题。 我们首先想到线段树。但有没有更快的方法呢?对于这类问题,我们可以用ST表(稀疏表)算法求解。 稀疏表算法。其实也是一种动态规划的算法。是先做一遍预处理,然后O(1)求出答案。 设计状态 : f[i][j] 表示从第i个数开始连续2^j...原创 2018-02-14 15:54:26 · 234 阅读 · 0 评论 -
【POJ 2411】 Mondriaan's Dream
【题目链接】 点击打开链接【算法】 很明显,我们可以用状态压缩动态规划解决此题 f[n][m]表示n-1行已经放满,第n行状态为m的合法的方案数 状态转移方程很好推 注意这题时限较紧,注意加一些小优化 【代码】 #include <algorithm>#include <bi...原创 2018-04-24 22:48:02 · 125 阅读 · 0 评论 -
【HDU 2167】 Pebbles
【题目链接】 点击打开链接【算法】 状压DP 先搜出一行符合的情况,然后,f[i][j]表示第i行,状态为j,能够取得的最大值,DP即可【代码】 #include<bits/stdc++.h>using namespace std;#define MAXN 16const int MAXS = 65536;...原创 2018-05-09 19:20:22 · 164 阅读 · 0 评论 -
【SCOI 2005】 互不侵犯
【题目链接】 点击打开链接【算法】 和HDU2167类似 先搜出一行内符合的状态,然后,f[i][j][k]表示第i行,第j种状态,放了k个,合法的方案,DP即可【代码】 #include<bits/stdc++.h>using namespace std;#define MAXN 10#define MAXK ...原创 2018-05-09 19:23:42 · 550 阅读 · 0 评论 -
【SCOI 2005】 最大子矩阵
【题目链接】 点击打开链接【算法】 动态规划 我们发现,M只有两种取值,1和2,那么,只需分类讨论即可 当M = 1时,其实这个问题就成了就最大连续子段和的问题,只不过要选K段而已 用f[i][j]表示选到第i行,选了j段,那么,显然有 : f[i][j] = max{f[i-1][j],f[k][j-1]...原创 2018-05-09 19:53:07 · 159 阅读 · 0 评论 -
【POJ 1655】 Balancing Act
【题目链接】 点击打开链接【算法】 树形DP求树的重心【代码】 #include <algorithm>#include <bitset>#include <cctype>#include <cerrno>#include <clocale>#include <cm...原创 2018-04-21 18:43:27 · 185 阅读 · 0 评论 -
【NOIP 2003】 加分二叉树
【题目链接】 点击打开链接【算法】 树形DP即可【代码】 #include<bits/stdc++.h>using namespace std;#define MAXN 50int i,j,k,n,l,r,mid;int d[MAXN],f[MAXN][MAXN],root[MAXN][MAXN]; template ...原创 2018-04-21 22:03:13 · 173 阅读 · 0 评论 -
【HDU 3555】 Bomb
【题目链接】 点击打开链接【算法】 数位DP【代码】 #include<bits/stdc++.h>using namespace std;#define MAXL 15typedef unsigned long long ULL;ULL T,n,a[MAXL];ULL dp[MAXL][10];template &...原创 2018-04-25 19:19:21 · 211 阅读 · 0 评论 -
【HDU 2089】 不要62
【题目链接】 点击打开链接【算法】 数位DP 和上一题 : HDU3555很像【代码】 #include<bits/stdc++.h>using namespace std;#define MAXL 10long long n,m;long long a[MAXL],dp[MAXL][MAXL];tem...原创 2018-04-25 19:54:28 · 125 阅读 · 0 评论 -
【HDU 4722】 Good Numbers
【题目链接】 点击打开链接【算法】 f[i][j]表示第i位,数位和对10取模余j的数的个数 状态转移,计算答案都比较简单,笔者不再赘述【代码】 #include<bits/stdc++.h>using namespace std;#define MAXL 20long long i,T,n,m;lo...原创 2018-04-25 20:54:16 · 102 阅读 · 0 评论 -
【HAOI 2007】 上升序列
【题目链接】 点击打开链接【算法】 将序列反转,求最长下降子序列 对于每个询问,根据字典序性质,贪心即可【代码】 #include<bits/stdc++.h>using namespace std;#define MAXN 10010int i,j,len,n,q,mx,pre,l;int a[MAXN]...原创 2018-05-16 23:03:10 · 146 阅读 · 0 评论 -
【TJOI 2014】 上升子序列
【题目链接】 点击打开链接【算法】 先考虑50分的做法 : f[i]表示以i结尾的本质不同的上升子序列的个数 则f[i] = sigma(f[j]) (j < i,a[j] < a[i]),注意如果a[j]不止一个,只需加上下标最大的即可,否则会重复计数 那么,100分的做法,其实就是用...原创 2018-05-10 20:49:39 · 179 阅读 · 0 评论 -
【HDU 3652】 B-numbers
【题目链接】 点击打开链接【算法】 数位DP f[i][j][k][l]表示i位数,第一位为j,除以13的余数为k,是/否包括子串“13”的方案数【代码】 #include<bits/stdc++.h>using namespace std;#define MAXL 13int i,n;int a[M...原创 2018-06-04 22:15:17 · 137 阅读 · 0 评论