题目描述

帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数。游戏规则如下:

1.每次取数时须从每行各取走一个元素,共n个。m次后取完矩阵所有元素;

2.每次取走的各个元素只能是该元素所在行的行首或行尾;

3.每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取走的元素值*2^i,其中i表示第i次取数(从1开始编号);

4.游戏结束总得分为m次取数得分之和。

帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分。

输入输出格式

输入格式:

输入文件game.in包括n+1行:

第1行为两个用空格隔开的整数n和m。

第2~n+1行为n*m矩阵,其中每行有m个用单个空格隔开的非负整数。

数据范围:

60%的数据满足:1<=n, m<=30,答案不超过10^16

100%的数据满足:1<=n, m<=80,0<=aij<=1000

输出格式:

输出文件game.out仅包含1行,为一个整数,即输入矩阵取数后的最大得分。

输入输出样例

输入样例#1:

  1. 2 3
  2. 1 2 3
  3. 3 4 2
输出样例#1:

  1. 82

说明

NOIP 2007 提高第三题

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define maxn 100
  6. using namespace std;
  7. struct bigint{
  8. int a[maxn];//a[0]存位数
  9. bigint(){memset(a,,sizeof(a));}
  10.  
  11. bigint& operator=(const string s){//字符串类的赋值
  12. int k=;
  13. for(int i=s.size()-;i>=;i--){
  14. k++;
  15. this->a[k]=s[i]-'';
  16. }
  17. a[]=s.size();
  18. return *this;
  19. }
  20. bigint& operator=(const int s){
  21. int num=s,i=;
  22. while(num){
  23. i++;
  24. this->a[i]=num%;
  25. num/=;
  26. }
  27. this->a[]=i;
  28. return *this;
  29. }
  30.  
  31. /* bigint& operator=(const bigint &s){
  32. memset(a,0,sizeof(a));
  33. this->a[0]=s.a[0];
  34. for(int i=1;i<=s.a[0];i++){
  35. this->a[i]=s.a[i];
  36. }
  37. return *this;
  38. }*/
  39. //赋值部分结束
  40.  
  41. //运算符+
  42. bigint operator +(const bigint b){
  43. bigint c;
  44. c.a[]=max(a[],b.a[]);
  45. for(int i=;i<=c.a[];i++){
  46. c.a[i]+=(a[i]+b.a[i]);
  47. c.a[i+]+=c.a[i]/;
  48. c.a[i]%=;
  49. }
  50. if(c.a[c.a[]+]>)
  51. c.a[]++;
  52. return c;
  53. }
  54.  
  55. //比较
  56. /*bool operator <(const bigint b){
  57. if((this->a[0])!=b.a[0]) return (this->a[0])<b.a[0];
  58. for(int i=b.a[0];i>=1;i--){
  59. if((this->a[0])!=b.a[i])
  60. return (this->a[i])<b.a[i];
  61. }
  62. return false;
  63. }*/
  64.  
  65. bool operator <(const bigint b){
  66. if(this->a[]<b.a[])
  67. return true;
  68. if(this->a[]>b.a[])
  69. return false;
  70. for(int i=b.a[];i>=;i--){
  71. if(this->a[i]!=b.a[i])
  72. return this->a[i]<b.a[i];
  73. }
  74. return false;
  75. }
  76. bool operator >(bigint b){//不可写const,会报错
  77. return b<(*this);
  78. }
  79. };
  80.  
  81. ostream& operator<<(ostream&out,const bigint a){
  82. for(int i=a.a[];i>=;i--)
  83. out<<a.a[i];
  84. return out;
  85. }
  86. istream& operator>>(istream&in,bigint& a){//不可写const
  87. string s;
  88. in>>s;
  89. a=s;
  90. return in;
  91. }
  92.  
  93. int main(){
  94. int n,m;
  95. cin>>m>>n;
  96. bigint a[];
  97. bigint tot,f[maxn][maxn];
  98. bigint q,p;
  99. for(int num=;num<=m;num++){
  100. for(int i=;i<=n;i++)
  101. cin>>a[i];
  102. for(int i=;i<=n;i++)//预处理
  103. f[i][i]=a[i]+a[i];
  104.  
  105. for(int l=;l<n;l++){
  106. for(int i=;i<=n&&i+l<=n;i++){
  107. int j=i+l;
  108. p=a[i]+f[i+][j];
  109. q=a[j]+f[i][j-];
  110. if(p<q)
  111. f[i][j]=q+q;
  112. else
  113. f[i][j]=p+p;
  114. }
  115. }
  116. tot=f[][n]+tot;
  117. memset(&a,,sizeof(a));//注意&
  118. memset(&f,,sizeof(f));
  119. memset(&q,,sizeof(q));
  120. memset(&p,,sizeof(p));
  121. }
  122. cout<<tot<<endl;
  123. return ;
  124. }

注释部分比较函数不可用,待查

就是一个struct版的高精度,抄自http://www.luogu.org/problem/lists

TYVJ 矩阵取数 Label:高精度+dp的更多相关文章

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

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

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

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

  3. 矩阵取数问题(dp,高精)

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

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

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

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

    传送门 和奶牛那个题很像,每一行状态互不影响,也就是求 n 遍DP 不过高精度非常恶心,第一次写,调了我一上午. ——代码 #include <cstdio> #include <c ...

  6. TYVJ P1078 删数 Label:区间dp

    描述 有N个不同的正整数数x1, x2, ... xN 排成一排,我们可以从左边或右边去掉连续的i个数(只能从两边删除数),1<=i<=n,剩下N-i个数,再把剩下的数按以上操作处理,直到 ...

  7. NOIP2007矩阵取数[DP|高精度]

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

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

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

  9. 51Nod 1083 矩阵取数问题(矩阵取数dp,基础题)

    1083 矩阵取数问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下 ...

随机推荐

  1. 双操作系统Grub 引导修护

    ,只要进入ubuntu :sudo update-grub 就行了! 它会自动给Grub添加NTFS模块,以支持NTFS下的文件读取 转自: http://zhidao.baidu.com/link? ...

  2. Spring面试题集

    一.Spring简介       *  Spring框架有哪几部分组成? Spring框架有七个模块组成组成,这7个模块(或组件)均可以单独存在,也可以与其它一个或多个模块联合使用,主要功能表现如下: ...

  3. 【转】打造属于自己的Android Studio神器

    本文转载自:http://www.stormzhang.com/android/2015/05/26/android-tools/,并加以修改.黄色底部分是本人添加的内容. 一晃好久没更新博客了,最近 ...

  4. iOS 图片拉伸的解释

    以前对于ios的图片拉伸参数一直不太理解,终于看到一篇好文章,转载一下,原文地址:http://blog.csdn.net/q199109106q/article/details/8615661 主要 ...

  5. 现在, Delphi 的多线程已经非常易用了!

    先看一个非多线程的例子, 代码执行时不能进行其它操作(譬如拖动窗体): {自定义方法: 在窗体上绘制...} procedure MyMethod; var   i: Integer; begin   ...

  6. MongoDB副本集学习(二):基本测试与应用

    简单副本集测试 这一节主要对上一节搭建的副本集做一些简单的测试. 我们首先进入primary节点(37017),并向test.test集合里插入10W条数据: . rs0:PRIMARY> ;i ...

  7. Java for LeetCode 164 Maximum Gap

    Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...

  8. 【JAVA、C++】LeetCode 005 Longest Palindromic Substring

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  9. Ubuntu 13.04安装搜狗输入法

    Ubuntu 13.04安装搜狗输入法 [日期:2013-07-08] 来源:Linux公社  作者:LinuxIDC.com [字体:大 中 小]     目标:在Ubuntu 13.04以及基于U ...

  10. UVALive 7269 Snake Carpet (构造)

    题目:传送门. 题意:构造出一个矩阵,使得矩阵含有n条蛇,每条蛇的长度是1到n,并且奇数长度的蛇有奇数个拐弯,偶数长度 的蛇有偶数个拐弯. 奇数和偶数分开构造,奇数可以是: 1357 3357 555 ...