题目链接

  yeah终于过辣!

  DP,f[i][j]表示每行还剩i到j这个区间的数没取的时候的值。借这个题我也把高精度的短板弥补了一下,以后高精加高精乘应该是没问题了。

  哇终于不怂高精了……

  放上代码。

  

  1. #include<cstdio>
  2. #include<cctype>
  3. #include<iostream>
  4. #include<cstring>
  5.  
  6. inline long long read(){
  7. long long num=,f=;
  8. char ch=getchar();
  9. while(!isdigit(ch)){
  10. if(ch=='-') f=-;
  11. ch=getchar();
  12. }
  13. while(isdigit(ch)){
  14. num=num*+ch-'';
  15. ch=getchar();
  16. }
  17. return num*f;
  18. }
  19.  
  20. struct BigInteger{
  21. int s[],len;
  22. BigInteger(){ len=; memset(s,,sizeof(s)); }
  23.  
  24. bool operator >(BigInteger a){
  25. if(len!=a.len) return len>a.len;
  26. for(int i=len;i;--i){
  27. if(s[i]!=a.s[i]) return s[i]>a.s[i];
  28. }
  29. return ;
  30. }
  31.  
  32. bool operator ==(BigInteger a){
  33. if(len!=a.len) return ;
  34. for(int i=;i<=len;++i)
  35. if(s[i]!=a.s[i]) return ;
  36. return ;
  37. }
  38.  
  39. bool operator <(BigInteger a){
  40. return (!(*this>a)&&!(*this==a));
  41. }
  42.  
  43. BigInteger operator =(char* d){
  44. int size=strlen(d+);
  45. (*this).len=size;
  46. for(int i=size,tot=;tot<size;--i) (*this).s[++tot]=d[i]-'';
  47. return *this;
  48. }
  49.  
  50. BigInteger operator =(int num){
  51. char d[];
  52. sprintf(d+,"%d",num);
  53. *this=d;
  54. return *this;
  55. }
  56.  
  57. inline void out(){
  58. for(register int i=len;i;--i) printf("%d",s[i]);
  59. }
  60.  
  61. BigInteger operator +(BigInteger a){
  62. BigInteger ans;
  63. ans.len=;
  64. int size=std::max(len,a.len);
  65. for(int i=,g=;g||i<=size;++i){
  66. int now=s[i]+a.s[i]+g;
  67. ans.s[++ans.len]=now%;
  68. g=now/;
  69. }
  70. return ans;
  71. }
  72.  
  73. BigInteger in(){
  74. char d[];
  75. scanf("%s",d+);
  76. *this=d;
  77. return *this;
  78. }
  79.  
  80. BigInteger operator *(BigInteger a){
  81. BigInteger ans;
  82. ans.len=;
  83. int size=len+a.len;
  84. for(int i=;i<=len;++i)
  85. for(register int j=;j<=a.len;++j)
  86. ans.s[i+j-]+=s[i]*a.s[j];
  87. for(int i=;i<size;++i){
  88. ans.s[i+]+=ans.s[i]/;
  89. ans.s[i]%=;
  90. }
  91. while(size>&&!ans.s[size]) size--;
  92. ans.len=size;
  93. return ans;
  94. }
  95.  
  96. };
  97.  
  98. BigInteger Pow(BigInteger a,int b){
  99. if(b==) return a;
  100. BigInteger ret;
  101. ret=;
  102. while(b){
  103. if(b&) ret=ret*a;
  104. a=a*a;
  105. b>>=;
  106. }
  107. return ret;
  108. }
  109.  
  110. BigInteger f[][];
  111. BigInteger d[][];
  112. BigInteger ans;
  113. BigInteger two;
  114. int main(){
  115. two=;ans=;
  116. int n=read(),m=read();
  117. for(int i=;i<=n;++i)
  118. for(int j=;j<=m;++j) d[i][j]=read();
  119. for(int T=;T<=n;++T){
  120. memset(f,,sizeof(f));
  121. for(int len=m;len;--len){
  122. BigInteger Powval;Powval=Pow(two,m-len);
  123. for(int i=;i+len-<=m;++i){
  124. int j=i+len-;
  125. if(j<m&&f[i][j+]+Powval*d[T][j+]>f[i][j]) f[i][j]=f[i][j+]+Powval*d[T][j+];
  126. if(i>&&f[i-][j]+Powval*d[T][i-]>f[i][j]) f[i][j]=f[i-][j]+Powval*d[T][i-];
  127. }
  128. }
  129. BigInteger Max;Max=;
  130. BigInteger Powval=Pow(two,m);
  131. for(int i=;i<=m;++i)
  132. if(Max<f[i][i]+Powval*d[T][i]) Max=f[i][i]+Powval*d[T][i];
  133. ans=ans+Max;
  134. }
  135. ans.out();
  136. return ;
  137. }

【Luogu】P1005矩阵取数游戏(高精度+DP)的更多相关文章

  1. P1005 矩阵取数游戏 区间dp 高精度

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n \times mn×m的矩阵,矩阵中的每个元素a_{i,j}ai,j​均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n ...

  2. P1005 矩阵取数游戏[区间dp]

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的\(m*n\)的矩阵,矩阵中的每个元素\(a_{i,j}\)均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n个.经过m次后 ...

  3. 洛谷P1005 矩阵取数游戏

    P1005 矩阵取数游戏 题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次 ...

  4. 1166 矩阵取数游戏[区间dp+高精度]

    1166 矩阵取数游戏 2007年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description [ ...

  5. TYVJ 矩阵取数 Label:高精度+dp

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...

  6. [NOIP2007] 提高组 洛谷P1005 矩阵取数游戏

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...

  7. 洛谷 P1005 矩阵取数游戏

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...

  8. 洛谷 P1005 矩阵取数游戏 (区间dp+高精度)

    这道题大部分时间都在弄高精度-- 还是先讲讲dp吧 这道题是一个区间dp,不过我还是第一次遇到这种类型的区间dp f[i][j]表示取了数之后剩下i到j这个区间的最优值 注意这里是取了i之前和j之后的 ...

  9. P1005 矩阵取数游戏(动态规划+高精度)

    题目链接:传送门 题目大意: 给定长度为m的数列aj,每次从两端取一个数,得到2k * aj的价值(k为当前的次数,从1开始到m),总共有n行这样的数列,求最大价值总和. 1 ≤ n, m ≤ 80, ...

随机推荐

  1. org.apache.axis2.AxisFault: Service class XXXXX must have public as access Modifier解决方案

    使用Axis2工具生成客户端调用辅助类后,编写客户端调用代码运行时报错,完整错误信息如下: log4j:WARN No appenders could be found for logger (org ...

  2. IT之家学院:使用CMD命令行满速下载百度云

    转自:https://www.toutiao.com/a6545305189685920259/?tt_from=android_share&utm_campaign=client_share ...

  3. 获取SD卡下Android/data/下文件

    通常情况下多数应用程序都会将缓存的位置选择为 /sdcard/Android/data/<application package>/cache 这个路径.选择在这个位置有两点好处:第一,这 ...

  4. codevs 1146 ISBN号码

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver 题目描述 Description 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1 ...

  5. 博客高亮代码及使用OpenLiveWriter修改之前博客

    简述:  最近查阅前辈资料的时候,看到写的博客很有条理,回头看下自己的乱做麻花,然后来时研究: 他们的代码看起来很漂亮然后我就查资料,在网页版上一直没法出来像他们的格式,后查资料看来的使用客户端工具才 ...

  6. (一)SpringMVC之警告: No mapping found for HTTP request with URI

    这个警告往往是因为url路径不正确. 所以从三个地方下手: 1.springmvc-config.xml中的配置handle,看看是不是因为handle没有配置导致的. 2.如果是使用注解的方式的话, ...

  7. ABAP,Java, nodejs和go语言的web server编程

    ABAP and Java see my blog. nodejs 用nodejs现成的express module,几行代码就能写个server出来: var express = require(' ...

  8. flex常用属性

    <1>align-items: 垂直方向的对齐方式 align-items: stretch(拉伸,布满父容器) | center(垂直居中) | flex-start(上对齐) | fl ...

  9. python基础一 day9 函数升阶(3)

    局部命名空间一般之间是独立,局部命名空间是调用函数时生成的函数的名字指向它所在的地址局部不会对全局产生影响,除非加global.# def max(a,b):# return a if a>b ...

  10. spfa模板+讲解

    zz http://blog.sina.com.cn/s/blog_6ad20aef0100mc1a.html Spfa算法 (模板源代码) 这是Bellman Ford的改进算法.    算法介绍: ...