摘要: /*思路:遍历所有2^n个集合,对于每个集合求票和,如果满足票为优胜团体,而再对集合每个成员比较,是否满足变成非优胜团体,是的话,对于该成员对应结果+1。重点:利用二进制思想,所有团体均对应0~2^n-1的一个十进制数对应,而判别团体成员则需要用到位运算,比如团体9,对应的是1001,则包含第四个团体和第一个团体。 则判断团体号num,如果((num>>j)&1)==1,则是有该成员。这就是所谓状态压缩吧?*/#include#include#includeusing namespace std;int a[21],res[21];int n,sum;int main(){ 阅读全文
posted @ 2014-03-24 16:42 dengyaolong 阅读(203) 评论(0) 推荐(0) 编辑
摘要: function DrawLineBresenham(x1,y1,x2,y2)%sort by x,sure x1x2 tmp=x1; x1=x2; x2=tmp; tmp=y1; y1=y2; y2=tmp;enddx=x2-x1;dy=y2-y1;twoDy=2*dy;twoDy_Dx=2*(dy-dx);twoDx=2*dx;twoDx_Dy=2*(dx-dy);twoDxPlusDy=2*(dx+dy);%branch 1: k>0 ?%k>0 dy>0if dy>0 %k>0 if dx==0 %if k==INF ... 阅读全文
posted @ 2014-03-24 10:38 dengyaolong 阅读(963) 评论(0) 推荐(0) 编辑
摘要: 最近一直在学习算法,基本上都是在学习动态规划以及字符串。当然,两者交集最经典之一则是LCS问题。首先LCS的问题基本上就是在字符串a,b之间找到最长的公共子序列,比如 YAOLONGBLOG 和 YCLPBPG,其最长公共子序列则是YLBG当然当字符串比较大时候,枚举则略显困难。首先我们先考虑求一个基本问题,就是LCS的长度。很容易可以理解递推式:当a[i]==b[j],c[i][j]=c[i-1][j-1]+1;当a[i]!=b[j], c[i][j]=max(c[i-1][j],c[i][j-1]);对应HDU1159.Problem DescriptionA subsequence of 阅读全文
posted @ 2014-03-23 23:31 dengyaolong 阅读(180) 评论(0) 推荐(0) 编辑
摘要: 很经典的入门dp/*******************************************************************************//* OS : 3.2.0-58-generic #88-Ubuntu SMP Tue Dec 3 UTC 2013 GNU/Linux * Compiler : g++ (GCC) 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) * Encoding : UTF8 * Date : 2014-03-23 * All Rights Rese... 阅读全文
posted @ 2014-03-23 23:28 dengyaolong 阅读(160) 评论(0) 推荐(0) 编辑
摘要: 我们刷题的时候除了编码外,测试也是非常重要的,当测试样例比较小的时候,我们完全可以手打,但是当测试样例比较大时候,我们就抓狂了~相信不少人都知道利用文件流,但是应该还有新手跟我一样,一遍又一遍地输入测试样例~其实很简单,就两句代码。#include //包含头文件,c语言的就是stdio.hfreopen("in.txt","r",stdin);//在main 函数最开始加入,在当前工程下创建in.txt,之后加入数据fclose(stdin);//在程序return 0前加入。当然,如果纯粹是上面的代码,还是很琐碎,需要我们每次提交时候注释掉……为了方 阅读全文
posted @ 2014-03-21 11:20 dengyaolong 阅读(359) 评论(0) 推荐(0) 编辑
摘要: 从别的地方看来,最近一直在啃DP,有个目标,更有动力了。1.Robberies连接 :http://acm.hdu.edu.cn/showproblem.php?pid=2955背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱最脑残的是把总的概率以为是抢N家银行的概率之和…把状态转移方程写成了f[j]=max{f[j],f[j-q[i].v]+q[i].money}(f[j]表示在概率j之下能抢的大洋);正确的方程是:f[j]=max(f[j],f[j-q[i].money]*q[i].v)其中,f[j]表示抢j块大洋的最大的逃脱概率,条件是f[j-q 阅读全文
posted @ 2014-03-20 18:17 dengyaolong 阅读(183) 评论(0) 推荐(1) 编辑
摘要: 题目描述 有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌。但是麻烦的是,每当你翻一张纸牌(由正翻到反,或者有反翻到正)时,他左右两张纸牌(最左边和最右边的纸牌,只会影响附近一张)也必须跟着翻动,现在给你一个乱的状态,问你能否把他们整理好,使得每张纸牌都正面朝上,如果可以,最少需要多少次操作。 输入 有多个case,每个case输入一行01符号串(长度不超过20),1表示反面朝上,0表示正面朝上。 输出 对于每组case,如果可以翻,输出最少需要翻动的次数,否则输出NO。两星的题目,其实说真的,这题目蛮 阅读全文
posted @ 2014-03-18 15:46 dengyaolong 阅读(147) 评论(0) 推荐(0) 编辑
摘要: 题目大概的意思就是:小强用硬币买东西,硬币有N种,面值为Vi,店家有各种硬币都有无限个,而小强只有Ci个(分别对应Vi)问最小交易硬币数,就是一个有找零的背包问题啦。我的上一篇博客跟这hdu3591的类型非常非常接近,所以我很快就写完,并且很快地WA了无数次。后来很苦恼,看看别人写的代码,他们的思想大概是这样子。用dp2去记载找零,就是dp2[i]=min{dp2[i],dp2[i-V]+1 } V为要付的总款之后再从V到INF处得到ans=min{ans,dp[i]+dp2[i-V]};思路是很清晰啦,很快我又CODE了一段。马上又WA了无数次。正当我无力时候,我发现!!!!原来是我的Zer 阅读全文
posted @ 2014-03-17 22:53 dengyaolong 阅读(191) 评论(0) 推荐(0) 编辑
摘要: 话说今天做背包做到有点累了,题目是英文的……而且还很长,我看了好久(弱爆了)。题目大概的意思就是,有六种硬币,之后,求用这六种硬币最小数目支付1到100美分的平均值,以及最小数目中的最大值。很容易就想到了不找零的情况。即:1 2 5 45 50 60 六种硬币中,我买了49分,那么应该就是45 +2+2 3个硬币,但是有找零情况下就是50 -1。这就头痛了,我在想,要不加入硬币为负数吧,想了一下,感觉有点吃力?!后来,听别人说,两次完全背包就好了,之后我就很兴奋地试验了一下,结果发现,真的OK。案例数据很轻松就OK了。一交,果断就WA了。!!!!!!一看,是输出时候只是一个空格,我删了一个,又 阅读全文
posted @ 2014-03-17 22:33 dengyaolong 阅读(192) 评论(0) 推荐(0) 编辑
摘要: 首先,什么叫多重背包呢?大概意思就是:一个背包有V总容量,有N种物品,其价值分别为Val1,Val2……,Val3,体积对应的是Vol1,Vol2,……,Vol3,件数对应Num1,Num2……,Num3求背包至多装满的最大总价值。其实,首先可以当作01背包来做,这时候复杂度就是O(V*sum(Num[i]));简单代码来说就是 for(int i=1;i=Vol[i];k++) dp[k]=max(dp[k],dp[k-Vol[i]]+Val[i]);很容易超时。如果M大的话。从大神的背包九讲看到一个化成O(Vsum(log(Num[i])))大概意思就是... 阅读全文
posted @ 2014-03-11 14:58 dengyaolong 阅读(122) 评论(0) 推荐(0) 编辑