动态规划
SolarDomo
每天都被头像萌醒
展开
-
POJ 1221 整数分解 DP
POJ 1221 题意:将给定的整数N分解为多个整数的和 要求这个序列为回文串 且前半部分为非递减序列 dp[i,j] 表示将整数i分解为以j为开头的序列的方案数 得到状态转移公式 dp[i,j] = dp[i - 2 * j][k] (k * 2 <= i - 2 * j ^ k >= j ) 如果i - j * 2 >= j :dp[i,j]++ 以上公式 的意原创 2016-07-27 13:15:16 · 757 阅读 · 0 评论 -
HDU 4812 D Tree 点分治 + 逆元
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5977题目要求在树上找到一条链使得这条链上的点的乘积模mod等于k,求链首尾字典序最小的一条看到题目就能知道是一个点分治的题目,将树按照重心分治之后,就是要统计以重心为根的子树中,过树根的mod为k的链字典序最小的一条,这里的统计必需是在时间复杂度O(n) 以下才能过 代码:#pragma commen原创 2016-12-07 13:02:08 · 381 阅读 · 0 评论 -
HDU 4123 Bob’s Race 树形DP + RMQ
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4123代码://#include <bits/stdc++.h>#include <cstdio>#include <cstring>#include <cmath>using namespace std;const int maxn = 50000 + 5;int max(int a,int原创 2016-12-05 16:55:27 · 413 阅读 · 0 评论 -
UVA 11270 Tiling Dominoes 轮廓线DP
题目连接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2245轮廓线DP 裸题#include <bits/stdc++.h>using namespace std;typedef long long LL;const int maxst =原创 2016-12-02 11:40:07 · 356 阅读 · 0 评论 -
HDU 5945 Fxx and game 单调队列优化DP
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5945题意:数x, 1.如果x%k == 0 ,那么可以对x除以k 2.对x减去包括t以内的任意一个数 问多少步操作能使x变为0dp[j] 表示 j最少能在多少步以内达到1 那么有转移公式 1. 2. 第一个转移方程可以用一个单调递增队列来维护 这样总的复杂度就是O(X)的了代码:#inc原创 2016-11-02 17:26:08 · 286 阅读 · 0 评论 -
HDU 4003 Find Metal Mineral 树上分组背包
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 题意:一颗有根树N个节点的树和K个机器人,问把所有点都走到的最小花费树上分组背包问题这道题有一个要求就是这个机器人走完一颗树之后,还是可以回到树的根节点的,但也可以又机器人走这颗子树后不回到树根。 但是我们只要仔细的分析一下就可以看出来,假如一颗子树存在又机器人进去后又走回到树根,那么这个树只原创 2016-10-31 18:08:52 · 361 阅读 · 0 评论 -
HDU 1712 分组背包问题
题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=1712 题意:有M天可以分给N个课程,课程得分和课程上的天数有关,问在M天以内最多一共可以得到多少分一个分组背包的入门题,把一个课程上不同的天数得到的分数看作是一组的,每组最多只能选一个物品 每一个物品的代价是上的天数,价值是这门课在这个天数上得到的分数 那么这样就是一个分组背包问题二维DP数组原创 2016-10-31 17:30:15 · 306 阅读 · 0 评论 -
CodeForces 149D Coloring Brackets 区间DP
题目链接:http://codeforces.com/problemset/problem/149/D代码:#include <cstdio>#include <iostream>#include <cstring>#include <stack>#include <cstdlib>#define sf scanf#define pf printfusing namespace std原创 2016-10-08 10:53:13 · 333 阅读 · 0 评论 -
POJ 2342 Anniversary party 树形DP
题目链接:http://poj.org/problem?id=2342入门题: dp[rt][0] = sum{dp[ch][0] + dp[ch][1]} dp[rt][1] = sum{dp[ch][0]} 代码:#include <cstdio>#include <iostream>#include <cstring>#define sf scanf#define pf pri原创 2016-09-08 09:20:27 · 273 阅读 · 0 评论 -
HDU 5691 Sitting in Line 状压DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5691dp[st][j] 表示我们选择的数的状态为ST 放在序列的前count(ST)位上 且最后一位是第J个数的时候的最大收益 采用刷表法 代码:#include <bits/stdc++.h>#define sf scanf#define pf printfusing namespace st原创 2016-10-10 14:18:22 · 309 阅读 · 0 评论 -
区间DP 入门经典三道题
NYOJ 737:http://acm.nyist.net/JudgeOnline/problem.php?pid=737 代码:#include <cstdio>#include <iostream>#include <cstring>#define sf scanf#define pf printfusing namespace std;typedef long long LL;c原创 2016-08-15 14:17:08 · 1345 阅读 · 0 评论 -
HDU 3652 数位DP
题目链接 题意:1 - n中有多少个数 能被13整除 而且包含【13】数位dp状态dp[i][j][k][f] 第i位为j 除以13的余数为k f两个状态 0:没有包含13的个数 1:包含13的个数 状态转移方程: f = 1,j != 1 : dp[i][j][k][f] = SUM{ dp[i - 1][p][ (k - (j * 10 ^ (i - 1) ) + 13 )原创 2016-08-03 16:38:00 · 264 阅读 · 0 评论 -
HDU 2089 数位DP 入门题
[题目](http://acm.hdu.edu.cn/showproblem.php?pid=2089)提议:在n - m中有多少个数不含【4】 和 【62】dp[i][j] 表示第i位为j的答案数这样1. j = 6 dp[i][j] += dp[i - 1][k] (k = 0 ~ 9 ^ k != 4 | 2)2. j = 4 dp[i][j] = 0对于数字N 在计算0 - N原创 2016-08-03 14:48:40 · 380 阅读 · 0 评论 -
URAL 1057 数位DP
题目链接数位DP DP[i][j][k] 表示第i位 为j 选k个1 的方案数 转移方程 j > 1 DP[i][j][k] = 0; j = 1 DP[i][j][k] = DP[i - 1][1][k - 1] + DP[i - 1][0][k - 1] j = 0 DP[i][j][k] = DP[i - 1][1][k] + DP[i - 1][0][k]初始化 DP[1][1]原创 2016-08-03 20:01:39 · 383 阅读 · 0 评论 -
HDU 5773 DP LIS变形
题目链接题意:一个非负序列里 0可以变成包括负数在内的任何数 问这个序列的最长严格上升子序列有多长官方给的题解:0可以转化成任意整数,包括负数,显然求LIS时尽量把0都放进去必定是正确的。因此我们可以把0拿出来,对剩下的做O(nlogn)的LIS,统计结果的时候再算上0的数量。为了保证严格递增,我们可以将每个权值S[i]减去i前面0的个数,再做LIS,就能保证结果是严格递增的。条件一:这个最长的上升原创 2016-07-28 19:17:12 · 397 阅读 · 0 评论 -
CodeForces 13C DP
题意:给一个长度为N的数组,每次可以对其中一个数加一或减一。求使数组变为非减的最小操作次数。 Dp( i , j ) = min{ dp(i - 1, k ) } (k <= j ) + fabs(num[i] - w[j]); num[i] w[j] 分别为数组中第i个数 和数组中升序排列后第j个数; min{dp(i - 1,k)} 可以用一个数组(min_dp )原创 2015-11-09 11:20:27 · 810 阅读 · 0 评论 -
Uva 1471 用Set优化查询
题意: 一个长度为N的数组,可以从里面删除长度任意(可以为0)的连续子序列,使得之后的最长的连续上升子序列长度最大。最初的想法是遍历两次数组,进行预处理。得出F,G。 F[i] G[i] 分别为一i为结尾和以i为开头的最长连续上升子序列。之后枚举i,j 得到在Num[i] < Num[j] 的情况下得到max( F[i] + G[j] ),即为答案。 复杂度为O(n ^ 2) 然而这题的数据量原创 2015-11-25 16:54:22 · 301 阅读 · 0 评论 -
POJ 2479 DP
[http://poj.org/problem?id=2479](http://poj.org/problem?id=2479) 题意: 对一个数列中的两个不相交的子区间A和B 找到两个区间和的最大值S原创 2016-07-24 18:48:56 · 363 阅读 · 0 评论 -
HDU 4804 Campus Design 轮廓线DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4804分情况讨论: 1.枚举的点上有障碍物,那么上一个阶段的状态,在这个点上面的格子一定有被填充 2.枚举的点上没有障碍物 a.这个格子不放,那么上一个阶段的状态上,这个点上面的格子一定有被填充 b.这个格子放1 * 1的物体,那么上一个阶段的状态,这个格子的上面也是被填充 c.这个格子横着放1原创 2016-12-07 15:20:22 · 428 阅读 · 0 评论