首页 > TAG信息列表 > HAOI2010

洛谷P2517 HAOI2010 订货 (费用流)

标准的费用流问题,关键在于巧妙地建模 一共有n个月份,源点设为0,汇点设为n+1 1.源点向所有月份连边,容量为正无穷,费用为该月进货的费用 2.每个月向下一个月连边,容量为仓库容量,费用为存货费用 3.每个月向汇点连边,容量为该月卖货的数量,费用为0(卖货不会产生费用) 用最小费用最大流求解即可

[HAOI2010]计数题解

题目

[解题记录] [HAOI2010]软件安装

P2515 [HAOI2010]软件安装 题意简述 现在我们的手头有 \(N\) 个软件,对于一个软件\(i\) ,它要占用 \(W_i\) 的磁盘空间,它的价值为 \(V_i\) ,我们希望从中选择 一些软件安装到一台磁盘容量为 \(M\) 计算机上,使得这些软件的价值尽可能大(即 \(V_i\) 的和最大),软件之间存 在=依赖关系,即软

洛谷 P2515 [HAOI2010]软件安装

链接: P2515 题意: 给出 \(n\) 个点的重量,价值和它的依赖关系,再给出背包大小 \(m\),求最大价值。 分析: 这道题和选课有点像。但这题可能有多个点的依赖关系形成环,此时环内点的取舍关系是一致的,所以要先用 tarjan 缩点,强连通分量需要维护重量和以及价值和。缩点后构造一张由强连通分

P2516 [HAOI2010]最长公共子序列 题解

题目传送 更好的阅读体验? Description 求两个字符串 \(a,b\) 的最长公共子序列以及出现次数。 Solution 看数据范围感觉是个 \(O(nm)\) DP,可是我不会写唉,那先把暴力搞出来吧。 设 \(f_{l,r}\) 表示第一个字符串匹配到 \(l\),第二个字符串匹配到 \(r\),并且子序列以 \(a_l,b_r\)

P2518 [HAOI2010]计数

题面 计数 这道题的题面上没有说清楚,在输入中出现的数字其实就是给定的集合。 题解 读完题后可能会没有思路,但是很快便不难发现,如果我们从左到右依次扫描每一个数字,如果后面有比这个数字小的数,就可以把这和数拿到这位来,在后面的数字中排出比它小的数。于是这道题就变成了可重集的

P2518 [HAOI2010]计数

Link 数位dp / 康托展开 Tips 当题目要用到排列组合,却未让你取模时,用以下形式求排列组合比较稳 注意将数组定义为double、或long double 其范围在1e300多,可求至100! void init(){ A[0][0]=C[0][0]=1; for(int i=1;i<maxn;i++){ for(int j=0;j<=i;j++){ if(j==0) A[i][

洛谷 P2515 [HAOI2010]软件安装

洛谷 P2515 [HAOI2010]软件安装 洛谷传送门 题目描述 现在我们的手头有NN个软件,对于一个软件i,它要占用W_iW**i的磁盘空间,它的价值为V_iV**i。我们希望从中选择一些软件安装到一台磁盘容量为MM计算机上,使得这些软件的价值尽可能大(即V_iV**i的和最大)。 但是现在有个问题:软件之间存在

[HAOI2010]软件安装 题解

题面 这道题比较显然地,是一道树形背包; 但是会有环,怎么办呢? 缩点!tarjan缩点! 然后在新图上跑树形背包就可以AC了 #include <bits/stdc++.h> #define inc(i,a,b) for(register int i=a;i<=b;i++) using namespace std; int head[1010],cnt,head2[1010],cnt2; class littlestar{ pub

【HAOI2010】最长公共子序列

普通的LCS是经典的DP问题,那么如果加上方案数,则与最短路计数类似的 1.如果相同,就加上方案数 2.如果可以被更新,就重新统计方案数 但在这一题中,有一种特殊情况要考虑 如果一个子串,(i-1,j)和(i,j-1)都是由(i-1,j-1)转移过来,那么如果在更新f(i,j)时,就不可以用(i-1,j-1)继续累加,就应判定

【HAOI2010】软件安装

需要安装n个软件,每个软件会占用wi的空间,价值为vi 计算机总容量为M,要使这些软件的价值尽可能大 但软件之间存在依赖关系,即只有安装了前提软件,这个软件才有价值 求出结果 如果只是普通的依赖关系,那么这些关系构成了一棵树 显然使用树形dp,\(dp[i][j]\)表示以 \(i\) 为根的子树中使用

P2517 [HAOI2010]订货(dp)

P2517 [HAOI2010]订货 设$f[i][j]$表示第$i$个月,库存为$j$的最小代价 枚举上个月的库存$k$,那么$f[i][j]=f[i-1][k]+(j+U[i]-k)*D[i]+j*m,k<=min(j+U[i],S)$ 复杂度$O(nS^2)$ 把上面的方程拆项 $f[i][j]=(j+U[i])*D[i]+j*m+{f[i-1][k]-k*D[i]},k<=min(j+U[i],S)$ 这个$k$可以直接跟

软件安装「HAOI2010」

题意 有\(n\)个软件,每个软件都可能有一个依赖软件(换言之,不安装依赖软件就不能安装该软件)。每个软件都有自己的容量和价值,已知总容量,求最大价值。 思路 tarjan+树上背包裸题。 代码 #include <bits/stdc++.h> using namespace std; namespace StandardIO { template<typena

P2515 [HAOI2010]软件安装

傻了。。   思路:$scc$缩点,树上背包。 提交:2次(无语。。建边建错了) 思路:关系可能会形成环,而整个环是一个整体(要选就选环上所有点,否则整个不选),所以我们先把所有的环缩点,然后便形成了一棵树(一个点不可能有两个父亲),然后跑树上背包。 代码: #include<cstdio>#include<iostream>using n

BZOJ 2427: [HAOI2010]软件安装 tarjan + 树形背包

Code:  #include<bits/stdc++.h>using namespace std; #define setIO(s) freopen(s".in","r",stdin) #define maxn 600 int edges,n,m; int w[maxn],cost[maxn],hd[maxn],to[maxn<<1],nex[maxn<<1],val[maxn]; void addedge(int

P2516 [HAOI2010]最长公共子序列 单调队列/ST表

开一个单调队列,下标递增,值递减。 然后在上面二分最大数。 如果加上并查集可以做到接近线性。 还有一种是插入一个数然后,从后向前更新ST表。 #include<cstdio>#include<iostream>#define R register intusing namespace std;inline int g() { R ret=0,fix=1; register char ch;

洛谷$P$2518 计数 $[HAOI2010]$ 数位$dp$

正解:数位$dp$ 解题报告: 传送门$w$ 感觉省选的数位$dp$还是比较有质量的辣,,,至少有一定的思维难度是趴$QwQ$ 这题要考虑到一个,我认为比较关键的点,就,对于一个位数不满的数,可以理解为前面都是0 换句话说,其实这道题是求给定的数$n$的各个组成数的全排列中$n$排第几 到这儿其实

HAOI2010 工厂选址

题目链接:戳我 数组开小火葬场qwqwq 就是一个贪心吧。对于一个数,我们知道只有两种摆放方式。所以我们可以先都放到新的里面,然后做一下新的-原先的差,按照差从大到小排序,依次提取数值减去即可。 代码如下: #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #i