网站大量收购独家精品文档,联系QQ:2885784924

ABPr0blem题解综述.docVIP

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
A+B Problem题解综述{牛人版} 【题目描述】 输入两个自然数,输出他们的和 【输入数据】 两个自然数x和y(0=x,y=32767) 【输出数据】 一个数,即x和y的和 【思路】 此题考查动态规划思想首先我们需要把输入字符转换为数字a,b 然后使用动态规划求解A+B的值 最后输出答案我们可以设计出如下DP方程令f[j]表示i+j的值 则有f[0][0]=0 f[j]=max {f[i-1][j]+1, f[i][j-1]+1} 由于对于每个i,j我们都要计算出f[j],因此时间复杂度与空间复O(n^2) 但是 对于题目提供的最大数字n=32767明显超时! 【优化1】 对于DP方程 由于每次计算只需要f[i-1][j]或f[j-1]因此我们可以使用滚动数组优化DP的空间复杂度 使用两个整数x,y分别保存f[i-1][j]与f[j-1]空间复杂度降为O(2) 然而时间复杂度O(n^2)仍然超时! “时间复杂度,到目前为止还没有更好的优化方法。因此,此题被称为史上最难的dp??” 【优化2】 对于整数的运算 我们可以利用位运算的思想简化复杂度题目显然要我们求两非负整数之和。 我们知道,在非负整数加法的二进制逻辑运算中,每一位上的结果取决于以下两方面: 1、本位上两个逻辑位的异或值 2、后一位的结果是否溢出利用这种性质,可以考虑如下做法:令f[j]表示,考虑两个加数的后i、j位相加的结果, 显然有以下状态转移方程f[j]= max{f[i][j-1]+y (1 (j-)) f[i-1][j]+x (1 (i-1)) } 复制代码赋初值f[0][0]=(x 1) ^ (y 1)两个循环变量i,j从1循环到log(2,maxint) 我们成功的把时空复杂度降为O(log^2n)利用滚动数组,可以进一步降低复杂度为O(2) 至此,我们得到了一个较为圆满的解答 【题目评价】 此题实质上非常复杂 全面考察到了数学史和计算机史 经典代数 常用计算与输入输出 动态规划思想以及位运算思想等等等等知识点考虑到题目的所有可能性 我们应当从计算机存储的二进制的角度来逐步考虑数的表示 以字节计数, 采用多字节合用的方式表示一个大整数如今已经是高级程序语言编译器轻松可以达到的目标 可是为了加强对计算机计数的了解 此题可以考虑仍以最原始的方式进行计算 并且考虑最终将二进制数转变为十进制输出的全部过程 期间还考察了对ASCII码的熟悉程度然而此题再VIJOS上的通过人数竟然高达59% 可以看出VIJOS上大牛之多 不禁令人赞叹宋神牛用最小网络流 program problem; var en,et,ec,eu,ep,ex:Array[0..250000] of longint; dis:array[0..1000] of longint; v:array[0..1000] of boolean; i,j,k,n,m,w,cost,l:longint; a,b,ans,left,right:longint;function min(a,b:longint):longint; begin if ab then min:=a else min:=b end;procedure addedge(s,t,c,u,k:longint); begin inc(l); en[l]:=en[s]; en[s]:=l; et[l]:=t; ec[l]:=c; eu[l]:=u; ep[l]:=l+k; end;procedure build(s,t,u,c:longint); begin addedge(s,t,c,u,1); addedge(t,s,-c,0,-1); end;function aug(no,m:longint):longint; var i,d:longint; begin if no=n then begin inc(cost,m*dis[1]); exit; end; v[no]:=true; i:=ex[no]; while i0 do begin if (eu[i]0) and not v[et[i]] and (dis[et[i]]+ec[i]=dis[no]) then begin d:=aug(et[i],min(m,eu[i])); if d0 then begin dec(eu[i],d); inc(eu[ep[i]],d); ex[no]:=i; exit(d); end; end; i:=en[i]; end; ex[no]:=i; exit(0); end;function modlabel:boolean; var d,i,j:longint; begin d:=maxlongint; for i:=

文档评论(0)

jdy261842 + 关注
实名认证
文档贡献者

分享好文档!

1亿VIP精品文档

相关文档