OJ题号:洛谷1005

思路:

动态规划。

不难发现每行能够取得的最大值仅与当前行的数据有关,因此本题可以对每行的数据分别DP,最后求和。

设$f_{i,j}$表示左边取$i$个、右边取$j$个的最大值,则DP方程为$f_{i,j}=max(f_{i-1,j}+a_{i-1}*2^{i+j},f_{i,j-1}+a_{m-j}*2^{i+j})$。

然而数据规模较大,使用 int 只有40分,用 unsigned long long 只有60分。所以需要高精度,不过实现起来并不复杂。

另外有一些小小的优化,比如压位、预处理二的幂。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. class BigInt {
  5. private:
  6. static const int k=;
  7. int num[],len;
  8. public:
  9. BigInt() {
  10. memset(num,,sizeof num);
  11. len=;
  12. }
  13. BigInt(const int len,const int num) {
  14. this->len=len;
  15. this->num[]=num;
  16. }
  17. BigInt operator + (const BigInt &x) const {
  18. BigInt ans;
  19. for(int i=;i<=(ans.len=std::max(this->len,x.len));i++) {
  20. ans.num[i]+=this->num[i]+x.num[i];
  21. ans.num[i+]=ans.num[i]/k;
  22. ans.num[i]%=k;
  23. }
  24. if(ans.num[ans.len+]) ans.len++;
  25. return ans;
  26. }
  27. BigInt operator * (const int &x) const {
  28. BigInt ans;
  29. for(int i=;i<=(ans.len=this->len);i++) {
  30. ans.num[i]+=this->num[i]*x;
  31. ans.num[i+]=ans.num[i]/k;
  32. ans.num[i]%=k;
  33. }
  34. if(ans.num[ans.len+]) ans.len++;
  35. return ans;
  36. }
  37. bool operator < (const BigInt &x) const {
  38. if(this->len<x.len) return true;
  39. if(this->len>x.len) return false;
  40. for(int i=this->len;i>=;i--) {
  41. if(this->num[i]<x.num[i]) return true;
  42. if(this->num[i]>x.num[i]) return false;
  43. }
  44. return false;
  45. }
  46. BigInt& operator = (const BigInt &x) {
  47. this->len=x.len;
  48. std::copy(&x.num[],&x.num[len+],this->num);
  49. return *this;
  50. }
  51. void print() {
  52. printf("%d",num[len]);
  53. for(int i=len-;i>=;i--) {
  54. printf("%04d",num[i]);
  55. }
  56. printf("\n");
  57. }
  58. };
  59. const int M=;
  60. BigInt pow[M]={BigInt(,)};
  61. void calcpow(const int x) {
  62. pow[x]=pow[x-]*;
  63. }
  64. int main() {
  65. int n,m;
  66. scanf("%d%d",&n,&m);
  67. for(int i=;i<=m;i++) calcpow(i);
  68. BigInt ans;
  69. while(n--) {
  70. int a[m];
  71. BigInt f[m+][m+];
  72. for(int i=;i<m;i++) scanf("%d",&a[i]);
  73. memset(f,,sizeof f);
  74. BigInt max;
  75. for(int i=;i<=m;i++) {
  76. for(int j=;j<=m-i;j++) {
  77. if(i) f[i][j]=std::max(f[i][j],f[i-][j]+pow[i+j]*a[i-]);
  78. if(j) f[i][j]=std::max(f[i][j],f[i][j-]+pow[i+j]*a[m-j]);
  79. }
  80. max=std::max(max,f[i][m-i]);
  81. }
  82. ans=ans+max;
  83. }
  84. ans.print();
  85. return ;
  86. }

[NOIp2007提高组]矩阵取数游戏的更多相关文章

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

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

  2. 矩阵取数游戏 2007年NOIP全国联赛提高组(dp+高精)

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

  3. NOIP2007 矩阵取数游戏

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

  4. 洛谷1005 【NOIP2007】矩阵取数游戏

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

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

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

  6. 矩阵取数游戏 NOIP 2007

    2016-05-31 17:26:45 题目链接: NOIP 2007 矩阵取数游戏(Codevs) 题目大意: 给定一个矩阵,每次在每一行的行首或者行尾取一个数乘上2^次数,求取完最多获得的分数 解 ...

  7. 洛谷 P1005 矩阵取数游戏

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

  8. codevs1166 矩阵取数游戏

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

  9. 矩阵取数游戏洛谷p1005

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

随机推荐

  1. springboot系列八、springboot整合kafka

    背景: 当业务在同一时间出现高并发的时候,这个时候我们不想无限的增加服务器,但是又想提高吞吐量.这时可以考虑使用消息异步处理,进行消峰填谷:同时还可以降低耦合度.常见的消息中间件有kafka,rabb ...

  2. cactiez v11添加对mysql数据库、apache系统进行监控

    cactiez默认已经安装了mysql监控的模板,需要我们对服务器端和被监控的mysql客户端进行配置才能生效. 被监控的Mysql客户端: 如cactiez的IP为192.168.0.8 #添加一个 ...

  3. 使用Eclipse创建Web Services

    正文: 项目源文件: 百度云盘/博客园/project/wsServerExample/wsServerExample.rar 参考文献: http://www.ibm.com/developerwo ...

  4. 转载:Java的四种引用方式

    原文:https://www.cnblogs.com/huajiezh/p/5835618.html Java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指 ...

  5. java使用正则表达式的方法从json串儿,取想要的value值

    例子1: 现有json: ({"code":"200","json":["111"],"message&quo ...

  6. PCA和SVD最佳理解

    奇异值分解(SVD)原理与在降维中的应用 https://www.cnblogs.com/pinard/p/6251584.html 最通俗易懂的PCA主成分分析推导 https://blog.csd ...

  7. JQ初学总结一

    Jquery是最火的JavaScript库,大部分web开发都会用到就jquery,而作为初学者看了一些jq的用法总结自己的学习以增强自己的认知. 普通的javascript的缺点是:每种控件的操作方 ...

  8. vue系列之过渡效果

    参考地址:http://cn.vuejs.org/v2/guide/transitions.html vue2.0,要想实现过渡效果,要用transition组件 代码: <div id=&qu ...

  9. python易错题之lambda 以及 for循环中内嵌函数

    li = [] for x in range(10): print(x) //在函数没有执行前(li[0]()),for 循环中x已经执行完,x会一直为 9 def fun(): print(x) / ...

  10. 【C++ Primer | 15】C++虚函数表剖析②

    多重继承 下面,再让我们来看看多重继承中的情况,假设有下面这样一个类的继承关系. 注意:子类只overwrite了父类的f()函数,而还有一个是自己的函数(我们这样做的目的是为了用g1()作为一个标记 ...