dp

Acesrc and Travel(HDU6662+换根dp)

不问归期 提交于 2019-11-27 17:07:36
题目链接 传送门 题意 两个绝顶聪明的人在树上玩博弈,规则是轮流选择下一个要到达的点,每达到一个点时,先手和后手分别获得 \(a_i,b_i\) (到达这个点时两个人都会获得)的权值,已经经过的点无法再次经过,直到无法移动则结束游戏,两人都想最大化自己的权值和减对手权值和,问先手减后手权值和最大是多少。 思路 换根 \(DP\) ,和求树的直径有点类似。 \(dp[i][j]\) 表示在 \(i\) 这个结点状态为 \(j\) 时先手权值和减后手权值和最优是多少, \(j\) 为偶数表示当前是先手,为奇数时为后手。 转移方程:我们该 \(dp\) 是倒着推的,也就是说从游戏结束开始往游戏开始推,假设当前是先手选择,那么下一步就是后手移动,按照题目要求后手一定是想最小化先手减后手权值和,因此当前一定是从最小的先手减后手权值和转移过来;如果当前是后手那么就从先手减后手权值和最大转移过来。 需要特别注意的两点是: 从子结点转移过来很好想,就是子结点中相反状态转移过来,也就是当前为先手那么从最小过来;从父亲结点转移过来的时候,因为一个结点只有一个父亲结点,因此如果当前是先手,那么父亲结点也就确定了,因此它要从父亲结点从其他结点转移过来的最大值转移到当前结点,后手同理(因为这里我卡了好久,好菜啊)。 最后枚举答案的时候如果当前点是叶子结点,那么它的答案是从父亲结点贡献的,不能由它自己贡献

【杂题】【动态规划】——jzoj 6305. 最小值

二次信任 提交于 2019-11-27 16:28:27
dp+单调栈 6305. 最小值 (File IO): input: min.in output: min.out Time Limits: 1000 ms Memory Limits: 131072 KB Detailed Limits Goto ProblemSet Description Input Output Sample Input Sample 1: 5 0 0 1 10 9 9 5 2 6 Sample 2: 100 1 1 1 1 18515 13638 5356 485 8646 14871 18955 6206 7630 14703 6786 15099 15960 17822 435 3233 9775 20340 12669 14079 1164 3329 3642 16094 4294 2462 18926 16887 17661 8416 18196 20799 15422 1943 13795 11165 21418 5646 7773 11921 14908 9305 3334 13677 5757 6875 15324 20940 10919 7703 14804 19536 13777 3500 4797 6658 19839 2962 19871 2668 16584 19193 13887 20172 5323 11400 3381

hdu2159 完全背包???

若如初见. 提交于 2019-11-27 12:35:37
最近在刷dp,这道题看起来应该完全背包的。 题意 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能升掉这最后一级吗? 输入数据有多组,对于每组数据第一行输入n,m,k,s(0 < n,m,k,s < 100)四个正整数。分别表示还需的经验值,保留的忍耐度,怪的种数和最多的杀怪数。接下来输入k行数据。每行数据输入两个正整数a,b(0 < a,b < 20);分别表示杀掉一只这种怪xhd会得到的经验值和会减掉的忍耐度。(每种怪都有无数个)输出升完这级还能保留的最大忍耐度,如果无法升完这级输出-1。 input: 10 10 1 10 1 1 10 10 1 9 1 1 9 10 2 10 1 1 2 2 output: 0 -1 1 思路 因为每种怪可以无限刷,所以应该是个完全背包。但是由于我看到最多杀s个怪的限制,我就写了如下的方程: dp[i][j] = min(dp[i][j],dp[i-1][j-a[i]]+b[i]) 表示表示杀了i支怪

P1373 小a和uim之大逃离[DP]

不羁岁月 提交于 2019-11-27 12:12:26
题目描述 瞬间,地面上出现了一个n*m的巨幅矩阵,矩阵的每个格子上有一坨0~k不等量的魔液。怪物各给了小a和uim一个魔瓶,说道,你们可以从矩阵的任一个格子开始,每次向右或向下走一步,从任一个格子结束。开始时小a用魔瓶吸收地面上的魔液,下一步由uim吸收,如此交替下去,并且要求最后一步必须由uim吸收。魔瓶只有k的容量,也就是说,如果装了k+1那么魔瓶会被清空成零,如果装了k+2就只剩下1,依次类推。怪物还说道,最后谁的魔瓶装的魔液多,谁就能活下来。小a和uim感情深厚,情同手足,怎能忍心让小伙伴离自己而去呢?沉默片刻,小a灵机一动,如果他俩的魔瓶中魔液一样多,不就都能活下来了吗?小a和他的小伙伴都笑呆了! 现在他想知道他们都能活下来有多少种方法。 解析 很容易看出状态: \(dp[0/1][i][j][l][h]\) 分别表示小a和uim走到 \((i,j)\) 时瓶中的魔液。但是这样写会炸空间。 考虑到最终答案只与两人差值有关,即,从刚开始小a与uim差值为起始点 \((i,j)\) 的魔液,走到差值为0时为止。 由此,我们定义差值 \(k=a-uim\) ,得到新状态: \(dp[0/1][i][j][k]\) 。 考虑小a的转移:上一步由uim吸收,设当前差值为 \(k\) ,则上一步差值为 \(a-a[i][j]-uim\) ,即 \(k-a[i][j]\) 。

leetcode 103. Binary Tree Zigzag Level Order Traversal

一曲冷凌霜 提交于 2019-11-27 11:24:54
利用双向队列 偶数层当栈用, 奇数层当队列用 class Solution { public List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> res = new ArrayList<>(); Deque<TreeNode> dp = new LinkedList<>(); if(root == null) return res; dp.addFirst(root); boolean flag = true; while(!dp.isEmpty()){ int size = dp.size(); List<Integer> level = new ArrayList<>(); for(int i=0; i<size; i++){ if(flag){ TreeNode cur = dp.removeFirst(); System.out.println(cur.val); if(cur.left != null) dp.addLast(cur.left); if(cur.right != null) dp.addLast(cur.right); level.add(cur.val); }else{ TreeNode cur = dp.removeLast(); if(cur.right

ACM-ICPC 2018 徐州赛区网络预赛 F. Features Track(模拟 || dp)

感情迁移 提交于 2019-11-27 11:01:24
ACM-ICPC 2018 徐州赛区网络预赛 F. Features Track 题目 有 n 天,每天有一定量的点对,求点对连续出现最长的天数。 分析 两种方法, 用 p a i r pair p a i r 存点对,直接枚举每一天的 每一个点对 能往后连续多少天,连续的后面要标记一下,下次枚举后面的天,不枚举标记过的点对。 或者将点对用 m a p map m a p 映射成数字,然后动态规划。 d p [ i ] [ j ] dp[i][j] d p [ i ] [ j ] 表示前 i 天,j 出现的最大连续次数。 d p [ i ] [ j ] = d p [ i − 1 ] [ j ] dp[i][j] = dp[i-1][j] d p [ i ] [ j ] = d p [ i − 1 ] [ j ] ,取一个最大值。 模拟 模拟时找后面的天出现过没某一个点对,用 STL中的 f i n d find f i n d 方法; # include <bits/stdc++.h> using namespace std ; # define ll long long # define INF 0x3f3f3f3f # define pii pair<int, int> # define mk(x, y) make_pair(x, y) const int N = 1e5 +

【算法题】动态规划

独自空忆成欢 提交于 2019-11-27 10:55:52
动态规划一般分为三类问题: 计数 -有多少种方式走到右下角 -有多少种方法选出k个数使得和是Sum 最大最小值 -从左上角走到右下角路径的最大数字和 -最长上升子序列长度 存在性 -取石子游戏,先手是否必胜 -能不能选出k个数使得和是Sum 例题: 给出不同面额的硬币以及一个总金额. 写一个方法来计算给出的总金额可以换取的最少的硬币数量. 如果已有硬币的任意组合均无法与总金额面额相等, 那么返回 -1. 样例 样例1 输入: [1, 2, 5] 11 输出: 3 解释: 11 = 5 + 5 + 1 样例2 输入: [2] 3 输出: -1 解题步骤如下(以样例1为例): 确定状态。 最后一步(最优策略中使用的最后一枚硬币 \(a_k\) )、化成子问题(最少的硬币拼出更小的面值 \(11-a_k\) )。 转移方程。 \[ dp[X]=min\{ dp[X-2]+1,dp[X-5]+1,dp[X-7+1] \} \] 初始条件和边界条件。 $ dp[0] = 0 $,如果不能拼出Y, $ dp[Y] = INTMAX $ 计算顺序。 $ f[0],f[1],f[2]… $ 来源: https://www.cnblogs.com/lvjincheng/p/11360574.html

uva10201-dp

无人久伴 提交于 2019-11-27 10:37:23
题意: 租了一俩车从城市A到城市B,开始有100L油,油箱总共可以装200L油,行驶1KM要1L油,路上有加油站,离A有不同的距离,每升油价格不同。 问,到城市B油箱还有100L油,最少的花费是多少。 dp[i][j] 表示在站点 i 有油 j 时的最小花费。那么 dp[i][j] = min(dp[i-1][j+d[i]],dp[i][j]),d[i] 表示 i-1到i的距离。 dp[i][j]有俩个来源,一个是从dp[i-1][j+d[i]],dp[i][j]表示在站点i加油到j 的花费。 import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class Main { static Scanner scanner; final static int G = 110; // final static int G = 8; final static int T = 206; // final static int N = 5; // dij表示在i站点gas是j的时候最小花费 static int[][] dp = new int[G][T]; static int dis;

Balanced Numbers SPOJ - BALNUM

人盡茶涼 提交于 2019-11-27 09:34:48
代码+注释 1 //我感觉这道题最扯的就是我因为输入而TLE了半天,懵逼死了,想破脑袋也没想到因为输入TLE了半天 2 //题意:求区间内数字满足“奇数各数出现偶数次,偶数各数出现奇数次”的数字的个数。 3 //题解: 4 //dp[x][y]表示长度为x的时候0~9各出现的状态情况,因为可能有未出现的情况,如果这个y用二进制 5 //保存的话那么未出现的偶数可能会因为0而出现误判,所以应该多一个状态,就用三进制。0表示未出现, 6 //1表示出现了奇数次,2表示出现了偶数次。 7 //就是一道状压+数位dp,和XHXJ's LIS HDU - 4352 很相似 8 //XHXJ's LIS HDU - 4352(这个是状压成二进制+dp):https://www.cnblogs.com/kongbursi-2292702937/p/11934243.html 9 10 #include<stdio.h> 11 #include<string.h> 12 #include<algorithm> 13 #include<iostream> 14 using namespace std; 15 const int maxn=20; 16 const int N=1<<10; 17 typedef long long ll; 18 ll v[maxn],dp[maxn][60000],w

求最大独立集----树形dp

时光毁灭记忆、已成空白 提交于 2019-11-27 08:32:11
求最大独立集----树形dp 亲爱的选手, 我将在我的别墅在Hali-Bula举行一个聚会,以庆祝我从业连管退休。我希望我能邀请我所有的同事,但是想象一下,当一个员工在客人中找到他的老板时,他会怎样享受一个聚会!所以,我决定不邀请员工和他/她的老板。在业连管的组织层次是这样的,没有人有超过一个老板,而且只有一个员工没有老板(大老板)!我可以请你写一个程序来确定客人的最大数量,这样当他/她的老板也被邀请的时候,就不会有员工被邀请了吗?我已经附上了员工名单和业连管的组织等级。 最好, -布莱恩·班尼特 如果你的节目能说明如果我选择邀请有这种条件的客人的最大数量,那么这个名单是否是唯一确定的,我将不胜感激。 输入 输入由多个测试用例组成。每个测试用例都由一个包含整数的行开始。n(1≤)n(≤200),业连管的雇员人数。下一行只包含“大老板”的名称。以下每一项n-一行包括雇员的姓名和老板的姓名。所有的名字都是至少一个字串,最多100个字母,用空格隔开。每个测试用例的最后一行包含一个0。 输出量 对于每个测试用例,编写一行,其中包含一个数字,指示根据所需条件可以邀请的最大来宾数,以及一个单词“是”或“否”,这取决于在这种情况下来宾列表是否是唯一的。 样本输入 6 Jason Jack Jason Joe Jack Jill Jason John Jack Jim Jill 2 Ming