传送门

奶牛那个题很像,每一行状态互不影响,也就是求 n 遍DP

不过高精度非常恶心,第一次写,调了我一上午。

——代码

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4.  
  5. struct Big_int
  6. {
  7. int s[], idx;
  8. Big_int()
  9. {
  10. idx = ;
  11. memset(s, , sizeof(s));
  12. }
  13. };
  14.  
  15. int n, m;
  16. Big_int ans, a[], f[][];
  17.  
  18. inline void clear(Big_int &x)
  19. {
  20. x.idx = ;
  21. memset(x.s, , sizeof(x.s));
  22. }
  23.  
  24. inline Big_int Big(int x)
  25. {
  26. Big_int ret;
  27. while(x)
  28. {
  29. ret.s[ret.idx] = x % ;
  30. x /= ;
  31. ret.idx++;
  32. }
  33. return ret;
  34. }
  35.  
  36. inline bool operator > (const Big_int x, const Big_int y)
  37. {
  38. int i;
  39. if(x.idx > y.idx) return ;
  40. else if(x.idx < y.idx) return ;
  41. else for(i = x.idx - ; i >= ; i--)
  42. if(x.s[i] > y.s[i]) return ;
  43. else if(x.s[i] < y.s[i]) return ;
  44. }
  45.  
  46. inline Big_int Max(const Big_int x, const Big_int y)
  47. {
  48. return x > y ? x : y;
  49. }
  50.  
  51. inline int max(int x, int y)
  52. {
  53. return x > y ? x : y;
  54. }
  55.  
  56. inline Big_int operator + (const Big_int x, const Big_int y)
  57. {
  58. int i;
  59. Big_int ret;
  60. ret.idx = max(x.idx, y.idx) + ;
  61. for(i = ; i < ret.idx; i++)
  62. {
  63. ret.s[i] += x.s[i] + y.s[i];
  64. ret.s[i + ] += ret.s[i] / ;
  65. ret.s[i] %= ;
  66. }
  67. while(!ret.s[ret.idx - ] && ret.idx > ) ret.idx--;
  68. return ret;
  69. }
  70.  
  71. inline Big_int operator * (const Big_int x, const Big_int y)
  72. {
  73. int i, j;
  74. Big_int ret;
  75. ret.idx = x.idx + y.idx;
  76. for(i = ; i < x.idx; i++)
  77. for(j = ; j < y.idx; j++)
  78. {
  79. ret.s[i + j] += x.s[i] * y.s[j];
  80. ret.s[i + j + ] += ret.s[i + j] / ;
  81. ret.s[i + j] %= ;
  82. }
  83. while(!ret.s[ret.idx - ] && ret.idx > ) ret.idx--;
  84. return ret;
  85. }
  86.  
  87. inline void print(const Big_int x)
  88. {
  89. int i;
  90. if(!x.idx) printf("");
  91. else for(i = x.idx - ; i >= ; i--) printf("%d", x.s[i]);
  92. puts("");
  93. }
  94.  
  95. inline int read()
  96. {
  97. int x = , f = ;
  98. char ch = getchar();
  99. for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -;
  100. for(; isdigit(ch); ch = getchar()) x = (x << ) + (x << ) + ch - '';
  101. return x * f;
  102. }
  103.  
  104. inline Big_int dp(int x, int y, Big_int z)
  105. {
  106. if(f[x][y].idx) return f[x][y];
  107. if(x == y) return f[x][y] = a[x] * z;
  108. else return f[x][y] = Max(dp(x + , y, z * Big()) + a[x] * z, dp(x, y - , z * Big()) + a[y] * z);
  109. }
  110.  
  111. int main()
  112. {
  113. int i, j;
  114. n = read();
  115. m = read();
  116. while(n--)
  117. {
  118. for(i = ; i <= m; i++) a[i] = Big(read());
  119. for(i = ; i <= m; i++)
  120. for(j = ; j <= m; j++)
  121. clear(f[i][j]);
  122. ans = ans + dp(, m, Big());
  123. }
  124. print(ans);
  125. return ;
  126. }

[luoguP1005] 矩阵取数游戏(DP + 高精度)的更多相关文章

  1. [LuoguP1005]矩阵取数游戏 (DP+高精度)

    题面 传送门:https://www.luogu.org/problemnew/show/P1005 Solution 我们可以先考虑贪心 我们每一次都选左右两边尽可能小的数,方便大的放在后面 听起来 ...

  2. 【Luogu】P1005矩阵取数游戏(高精度+DP)

    题目链接 yeah终于过辣! DP,f[i][j]表示每行还剩i到j这个区间的数没取的时候的值.借这个题我也把高精度的短板弥补了一下,以后高精加高精乘应该是没问题了. 哇终于不怂高精了…… 放上代码. ...

  3. [P1005][NOIP2007] 矩阵取数游戏 (DP+高精)

    我不会高精…… 也不会DP…… 这道题即考高精又考DP…… 我要死了 给一个不是高精的代码(当然不能满分) #include<cstdio> #include<iostream> ...

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

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

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

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

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

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

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

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

  8. 矩阵取数游戏 NOIP 2007

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

  9. 矩阵取数游戏洛谷p1005

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

随机推荐

  1. tfs

    安装Team Foundation Server 2012过程截图 专题图 1,下载Team Foundation Server 2012  官方下载: http://www.microsoft.co ...

  2. 洛谷 P1865 A % B Problem(求区间质数个数)

    题目背景 题目名称是吸引你点进来的 实际上该题还是很水的 题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m 接下来n行,每行两个整数 l,r 表示区间 输出格式: 对 ...

  3. 1.2打印ASCII码

    描述 输入一个除空格以外的可见字符(保证在函数scanf中可使用格式说明符%c读入),输出其ASCII码. 输入一个除空格以外的可见字符.输出一个十进制整数,即该字符的ASCII码.样例输入 A 样例 ...

  4. [C陷阱和缺陷] 第2章 语法“陷阱”

    第2章 语法陷阱 2.1 理解函数声明   当计算机启动时,硬件将调用首地址为0位置的子例程,为了模拟开机时的情形,必须设计出一个C语言,以显示调用该子例程,经过一段时间的思考,得出语句如下: ( * ...

  5. 树形DP UVA 1292 Strategic game

    题目传送门 /* 题解:选择一个点,它相邻的点都当做被选择,问最少选择多少点将所有点都被选择 树形DP:dp[i][0/1]表示当前点选或不选,如果选,相邻的点可选可不选,取最小值 */ /***** ...

  6. 一个完整的mybatis项目,包含增删改查

    1.导入jar包,导入相关配置文件,均在自己博客园的文件中 编写mybatis.xml文件 <?xml version="1.0" encoding="UTF-8& ...

  7. 用SpringMVC实现的上传下载方式二(多文件上传)

    参考来源:      http://blog.csdn.net/qq_32953079/article/details/52290208 1.导入相关jar包 commons-fileupload.j ...

  8. 转 linux之sed命令详解

    http://jingyan.baidu.com/article/fec4bce2228f60f2618d8bb0.html sed  编辑裁剪文件命令 sed -i "s/\/db\/te ...

  9. Matlab vs Python 作图

    -- Matlab 作图示例 x=-3:0.00003:3; y1=sin(x)./x; y2=x./sin(x); plot(x,y1,x,y2); -- Python 作图示例 import nu ...

  10. java简单打印金字塔(案例)

    学习编程语言,打印简单的金字塔是基础的案例,在这里就简单的写了个案例,希望能帮助到各位 代码 效果 class  kinTa{    public static void main(String[] ...