- 博客(148)
- 资源 (3)
- 收藏
- 关注
原创 Denoising Variational Auto-Encoder 降噪变分自编码器
降噪变分自编码器(Denoising VAE),是将Denoising Criterion和VAE结合在一起的一种自编码器。大致来说,对输入按一个分布加入噪声,然后将扰乱后的样本作为的VAE的输入,并令VAE重构没有加入噪声的样本。 回顾VAE,对于所有样本,我们希望最大化其对数似然,即L被称为是变分下界,最大化logp(x)可以通过最大化变分下界实现,这里为了...
2020-01-02 15:39:26
4264
3
原创 Variational Auto-Encoder (VAE)论文阅读与公式推导
1.问题描述给定一个数据集,假设其满足样本间独立同分布。本质上,我们希望得到关于该数据集的真实的概率分布p(x),虽然有一些方法能够直接估计p(x)中某一点的概率(例如核密度估计、近邻方法),但这些方法一方面准确性较差,并且随着样本维度的升高,对样本数量的需求也是指数增加的。简单来说,我们多数情况下无法知道p(x)。 那么换一个思路,假设每个样本是由一组潜在的因素决定,这些因素...
2019-12-28 11:00:17
2041
原创 codeforce 609 Div2
Problem A给定一个数,求两个合数,差为这个数。构造方法有很多。#include <iostream>#include <algorithm>#include <string>#include <vector>#include <map>#include <cstring>#include <...
2019-12-23 10:14:03
215
原创 多目标优化问题中常见分解方法的理解
作为刚上研一提前来给老师当苦力的小菜鸟,第一次学习MOEAD算法的时候,对其中介绍的分解方法一脸懵*,上网查了不少资料,很难查到详细的解释(好吧,可能我查的姿势不对),完全不理解这些分割方法所给出的表达式的意义,索性搁置了小半个月。这里必须要感谢一下Chithon的http://blog.youkuaiyun.com/qithon/article/details/72885053#comments这篇博客
2017-07-25 10:43:23
42664
22
原创 Codeforces 577B
题意:给出n和m,然后给出n个数ai,让你判断从这n个数中取一个非空集合,集合中数的和对m取模为零,回答这的非空集合是否存在。范围:n 鸽巢原理:n+1个鸽子飞到n个鸽巢里,其中必有一个鸽巢有至少两只鸽子。那么根据这一题可知,分情况:当n>m时,求前缀和后,得到n个前缀和,又因为他们mod m的余数只有m个,必然存在一l和r使得suml mod m==sumr mod
2015-09-14 13:05:51
520
原创 关于分块问题的一些感想
看了bestcoder的一道题目,真心发现分块思想是一个很神奇的东西,我们所熟知的线段树其实就是分块思想的一种体现,而分块并不一定要按照线段树一样的进行二分,也可以对整个集合划分成若干段,然后利用预处理的每段信息进行查询操作,常见的就是划分成sqrt(n)段,见到有大神称之为“根号n法”,感觉挺贴切的,另外在看bc的题解的时候还学会了一种比较不错的hash方法,代码来自huanzhizun
2015-07-28 10:37:44
423
原创 3xN骨牌问题
这周的hihocoder的题目,感觉挺经典的,就贴上来吧。显然对于这种题目,显然需要求出递推关系后用矩阵乘法优化,详细的内容可以直接看hiho给的提示:3xN骨牌问题。代码如下:#include #define MOD 12357void p(int a[][8],int b[][8]){ int t[8][8]={0}; for(int i=0;i<8;i++) for(i
2015-04-20 19:15:20
500
原创 三分求点到二次函数最小值
三分的思想不再赘述,网上多得是,主要是三分是点的选择是个小trick,另外还有double类型变量判相等的条件。#include #include const double eps=0.00000001;double getf(double a,double b,double c,double x,double x0,double y0){ double t=a*x*x+b*x+c;
2015-04-04 23:43:30
793
原创 UVA 10673
还整什么求解模线性方程,题目比较特殊,并且可以输出任何一组解,那么看了大神的题解之后恍然大悟#include int main(){ int T; scanf("%d",&T); while(T--){ long long n,m; scanf("%I64d%I64d",&n,&m); if(n%m) printf("%I64d %I64d\n",-n,n);
2015-03-30 20:23:48
425
原创 UVA 106 (勾股数)
#include #include bool is[1000010];int gcd(int a,int b){ int r=1; while(r){ r=a%b; a=b;b=r; } return a;}int main(){ int n; while(scanf("%d",&n)!=EOF){ int ans1=0,ans2=0; for(int i
2015-03-30 20:22:09
530
原创 二分答案
hihocoder上的题目,之前codeforces又一次也用到过这种方法,直接对答案进行二分,并且根据题意验证。当对一道题目毫无头绪的时候,可以试试这种神奇的方法。#include #include #include #include #include using namespace std;int n,m,k,t,size=0;int vis[10010]={false};
2015-03-22 16:04:54
445
原创 hdu 5191
题意:给出n个高度不同的积木堆,求最少移动多少个可以得到W个连续的长度相等切位H的堆。 思路:枚举区间即可。比较坑的是G++的输入必须用输入挂才可以过,否则会超时。#include int h[200010];long long n,W,H,ans;long long mmin(long long a,long long b){ return a>b?b:a;}long l
2015-03-22 16:03:43
474
原创 Codeforces 296C
题目大意:给定长宽的矩形,执行n次操作,每次操作分两种类型,1.H型,水平切割,2.V型,竖直切割。对于每次切割,给定切割点,求出每次切割后最大的矩形面积 思路:直接用STL中的set即可。#include #include #include using namespace std;set x,y;// 记录长宽上各个切点set lx,ly;// 记录长宽上各个线段长度int
2015-03-18 15:25:41
388
原创 Codeforces 296 A
题目大意:给定长宽分别为a和b的矩形,每次折叠后截取折叠部分,问最终折成正方形要多少步。/*若a>b,可知至少需要折叠a/b次,此时a剩下的长度为a%b,然后调整a,b即可,注意若b|a,则显然最终结果多记了一次*/#include #include using namespace std;int main(){ long long a,b; scanf("%I64d%I64d"
2015-03-18 14:18:58
335
原创 Codeforces 296 B
题目大意:给定两个字符串,长度相等,定义距离为不同字符的个数,问选择s中任意两个字符,调换位置后能得出的最小距离。#include #include using namespace std;char s[200010],t[200010];bool is[26][26]={false};int ps[26][26];int main(){ int n,ans=0; scanf
2015-03-18 14:14:22
428
原创 COdeforces 396B
题目大意:给出一个n,ans = ∑(2≤i≤n)1/(v(i)*u(i)), v(i)为不大于i的最大素数,u(i)为大于i的最小素数, 求ans,输出以分式形式。 思路:可知1/(a*b)=(1/a-1/b)*(1/(b-a)),假设a1/(a*b)的数量刚好有b-a个,那么单独求出后半部分即可。ans=1/2-1/v(n)+(n-v(n)+1)/(v(n)*u(n))#incl
2015-03-16 21:39:19
464
原创 Coderforces 396A
组合数学,给出n个数,ai,然后取这n个数的积为m,计算将m分解成n个因子,问有多少种有序因子序列。 需要知道几个基本知识,c(n,m)=c(n-1,m-1)+c(n-1,m),讲n个物品分k份,每份至少一个物品,c(n-1,k-1)。#include #include #include using namespace std;map h;const int mod=10000
2015-03-16 21:03:37
421
原创 poj 1015
#include #include int dp[210][25][420],sd[210][25][410]={0},sp[210][25][410]={0},path[25];int p[210],d[210],s[210],r[210];int ab(int i){ return i>0?i:-i;}int main(){ //freopen("in.txt","r",s
2015-03-13 15:57:06
442
原创 无序数组的二分查找
对于有序数组,我们只需要简单的二分查找就可以了,但是对于无序数组,我们可以先排序在二分,但还有一种技巧就是结合快排的思想,即每次选择一个关键字,先将比他大的数放在其右边,比他小的数放在其左边,然后比较他和要查找的数的关系,并选择下次迭代的区间。#include int e[1000010];int main(){ int n,k,i; scanf("%d%d",&n,&k); fo
2015-03-09 13:14:22
3843
3
原创 二分图最大匹配——匈牙利算法
其实就是不断查询增广路,利用增广路中非匹配边比匹配边多一得性质优化匹配。 伪代码:Function FindPath(u) For v∈u的相邻节点 标记v已经查询过 If v未匹配 or FindPath(v的匹配的点) Then 更改u的匹配为v Return Ture E
2015-03-08 10:38:23
468
原创 二分图判定
题意:给定顶点数和边数的无向图,判定其是否为二分图。 思路:首先需要知道一个图是二分图并不代表其实联通的,那么遍历每个顶点,对其进行染色,并处理与之相邻的顶点,若无色,则染成与之相反的颜色,若有,则判断是否同色,若同色则不是二分图。所有顶点成功染色即为二分图。#include #include int c[10010];struct EDGE{ int to; struct E
2015-03-07 20:24:18
427
原创 UVA 10564
题意:给定沙漏,每个格子对应一个数,求给定路径权值和的路径条数即最小起点,最小字典序的路径。 思路:有数据范围可定义状态dp(i,j,k)表示第i行第j个格子到达终点的权值和为k的路径条数,那么 对于倒三角:dp(i,j,k)=dp(i+1,j-1,k-e[i][j])+dp(i+1,j,k-e[i][j]); 对于正三角:dp(i,j,k)=dp(i+1
2015-02-01 11:06:18
523
原创 UVA 10635
题意:给定两个序列,每个序列中的数字范围值1~n^2(2 思路:这个一开始先想到了空间复杂度需要优化,然后发现对于状态d(i,j)表示第一个序列的前i位和第二个序列的前j位的LCS可以用滚动数组优化空间为O(n),时间复杂度还是O(n^2),虽然用处不大,还是留作纪念。for(int i=1;i>a[i];for(int i=1;i>b[i];for(int i=1;i<=p;i++
2015-01-31 11:05:26
400
原创 UVA 10911
题意:求最小的组合代价。 思路:状态压缩,因为最多只有16个人,且只需考虑当前状态下是否在集合中,所以状态dp(i)表示状态为i时的最小代价,转移时必须确保枚举的两个人均不在集合中,还有一点需要注意的是初始化。#include #include #include #include using namespace std;double d[20][20],dp[132000];
2015-01-29 00:07:48
542
原创 UVA 11151
题意:求最长回文子序列。 思路:状态dp(i,j)表示从i到j的最长回文子序列长度,那么 dp(i,j)=dp(i+1,j-1)+2,str[i]==str[j] dp(i,j)=max(dp(i+1,j),dp(i,j-1)),str[i]!=str[j]#include #include #include #include using namespace
2015-01-28 14:03:07
385
原创 UVA 10891
题意:给定一组数,每一次选手可从左右两端任意一段选取连续的任意个数,至少选一个,甲先手,保证每次最优,则最后甲比乙得分多多少。 思路:和两端取一个数字的做法差不多,即dp(i,j)表示对于从i到j的序列,先手可得得最大分,那么dp(i,j)=sum(i,j)-min{min{dp(i,k)} (k=i~j-1),min{dp(k,j) (k=i+1~j)}},注意再求最小值是因为可以把整
2015-01-28 11:59:36
374
原创 UVA 10310
题意:求面值n用k个金币组成的方法数。 思路:一开始直接想到设状态dp(i,j)为面值i用j个硬币表示的方法数,但最后发现没办法转移,看到有人说用无限背包,可能是我理解不够深入,交了几次都WA了,最后查了写资料,发现需要用到一个结论,即面值i用j个金币组成的方法数等于面值i用不超过j的面值的金币组成的方法数。关于证明可以百度,用到了ferrers图像的性质,这样一来状态dp(i,j)表示面值
2015-01-27 23:48:44
441
原创 UVA 10029
题意:给定一个字典,找出连续变换的最长路径。 思路:我只想说LIS不超时啊,只需要预处理求出每个字符串长度就ok了。#include #include #include #include using namespace std;char e[25010][17];int dp[25010]={0},l[25010];bool ji(int pi,int pj,int li,
2015-01-27 11:32:27
489
原创 UVA 10453
题意:给定一个字符串,可向任意位置添加字符以构成回文串,求最少添加字符数和处理后的字符串。 思路:定义状态dp(i,j)为原串第i个字符到第j个字符够成回文的最小添加数,则 dp(i,j)=dp(i+1,j-1),(str[i]==str[j]) dp(i,j)=min{dp(i+1,j),dp(i,j-1)}+1,(str[i]!=str[j]) 相等
2015-01-24 11:24:46
373
原创 UVA 10201
题意:过n个加油站,没站油价不等,问达到目的地的最小花费,其实100L油,到达终点至少100L油。 设状态dp(i,j)表示在第i个加油站有jL油的最小花费,初始dp(i,j)=min{dp(i,j),dp(i-1,j+dis(i,i-1))},然后根据油价尝试更新dp(i,k),(k>j)。 小心数据所给加油站并不是都在起点到终点的区间内。#include #include
2015-01-24 11:04:37
415
原创 UVA 10154
题意:有n个乌龟,每个乌龟又一个重量和一个力量,叠罗汉,每个乌龟受重不大于其力量减去自身重量,问最高能叠多少层。 思路:存在一个最优解使得乌龟的力量从上到下是递增的,证明是比较简单的,对于任何一个最优解,假设相邻两层的重量为w[i-1]和w[i],力量为s[i-1]和s[i],并且s[i-1]>s[i],上方的最大重量为s[i]-w[i]-w[i-1],此时交换两个乌龟的位置,则上方最大重量
2015-01-22 20:00:49
521
原创 UVA 10617
#include #include #include using namespace std;long long dp[100][100];int main(){ int T; cin>>T; while(T--){ string t; cin>>t; memset(dp,0,sizeof(dp)); for(int i=1;i<=t.length();i++)
2015-01-19 18:37:53
354
原创 UVA 10271
状态dp(i,j)表前i只筷子中选出j对的代价,那么状态转移为dp(i,j)=min{dp(i-1,j),dp(i-2,j-1)+(leni-leni-1)^2}。#include #include #include using namespace std;int dp[5010][1010]={0},len[5010];int main(){ int T; cin>>T;
2015-01-19 11:00:45
416
原创 UVA 10304 dp的四边形不等式优化
最优二叉搜索树问题,设状态dp(l,r)为l到r构成一颗二叉树的最小花费,则有状态转移方程dp(l,r)=min{dp(l,k-1)+dp(k+1,r)+w(l,r)} (l 可以用记忆化搜索求解,需要注意边界条件即l>r是返回0,由于函数调用所消耗的时间,记忆化搜索这题用了4.725s。#include #include #include using namespace std;
2014-12-26 16:33:04
457
原创 UVA 10306
理解题意真是一个硬伤,这一题大致是格丁n个向量,求用这些向量相加得到给定长度的最小数。二维无限背包。一开始用了vector存到达过哪些节点,但写完发现没把顺序考虑进去,就直接遍历矩阵更新状态了。#include #include #include using namespace std;int dp[310][310];int main(){ int T; cin>>T; w
2014-12-22 20:46:27
389
原创 UVA 590
题目大意为小偷逃跑,有n个城市可以去,计划逃脱k天,问第k天到达目的地即n号城市的最小花费,主要是输入那部分比较不太好理解,每n-1行对应一个城市到达另外n-1个城市的信息,d表示循环节,之后d个整数表示每天的费用,0表示没有航班。 设状态dp(t,i)表示第t天在i号城市的最小花费,那么状态转移为dp(t,i)=min{dp[t-1][j]}(dp[t-1][j]!=-1 && cost
2014-12-22 15:00:37
507
原创 SPFA算法
求最短途径算法,因为其时间复杂度为O(|E|),所以适合边数较少的最短路径问题。 推荐两个不错的讲解,一个是hihocoder上的,http://hihocoder.com/contest/hiho25/problem/1,还有一个是NOCOW,http://www.nocow.cn/index.php/SPFA。 下边是一道裸SPFA的题目,输入顶点数,边数,起点,终点,求起点到终点
2014-12-21 11:45:40
404
原创 UVA 10651
题目大意是给12个空槽,初始时有以下空槽中有石头,可以把两个连续的石头移动到相邻的一个空槽,并移调中间的石头,求最少剩余几块石头。 用一个整数表示状态,因公也就不到10000种状态,数组记录即可,状态转移用位操作即可。#include #include #include #include #define lowbit(x) x&(-x)using namespace std;
2014-12-20 13:25:50
406
原创 UVA 10534
这题的题意很简单,求满足题目所给性质的子序列的最长长度,一开始竟然晕晕乎乎的用了枚举中间元素+LIS的方法求解,好吧,必然超时,然后用了常规的方法,从左到右求一次递减,从右到左再求一次,最后比较求解,提交后发现还是超时,此时已然意识到求LIS问题应该有更快的方法,于是乎上网一搜,果然有,下面是转载闷瓜蛋子的专栏博客中转载的介绍LIS问题的nlogn方法,原作者因为没有标明所以不知道最初的出处。
2014-12-16 21:21:17
416
原创 UVA 10069
题意为求母串中子序列的个数。一开始以为100*100*10000*sizeof(int)会存不下,一顿挠头皮,最后看了报告才知道可以存下,好吧,那么设状态dp(i,j)为母串前i位中含有子串前j位的序列数,那么状态转移显然为,如果母串第i位等于子串第j为,那么此时需要加上母串前i-1位中含子串前j位的数量以及母串前j-1位中含子串前j-1的数量,式子为dp(i,j)=dp(i-1,j)+dp(i-
2014-12-16 15:16:47
514
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人