题目描述

帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的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行,为一个整数,即输入矩阵取数后的最大得分。

这是世界上最丑的高精...然而并不能阻止我AC...

 #include<iostream>
 #include<cstdio>
 #include<cstring>
 #define LL long long
 #define M(x) memset(x,0,sizeof(x))
 using namespace std;
 void ADD(int a[],int b[],int c[]){
     ],b[]);
     ;i<=len;i++){
         c[i]+=a[i]+b[i];
         ){
             c[i+]+=c[i]/;
             c[i]%=;
         }
     }
     ]) c[]=len+;
     ]=len;
 }
 bool BIGGER(int a[],int b[]){
     ]==b[]){
         ];i>=;i--) if(a[i]!=b[i]) return a[i]>b[i];
     }]>b[];
 }
 void C(int a[],int b[],int c[]){
     ;i<=a[];i++){
         ;j<=b[];j++){
             c[i+j-]+=a[i]*b[j];
         }
     }
     c[]=a[]+b[]+;
     ;i<=c[];i++){
         c[i+]+=c[i]/;
         c[i]%=;
     }
     ]]&&c[]>) c[]--;
     return;
 }
 void change(int a,int b[]){
     ){
         b[++b[]]=a%;
         a/=;
     }b[++b[]]=a;
 }
 void print(int a[]){
     ];i>=;i--) printf("%d",a[i]);
 }
 ],v[][],mem[][][],ppow[][];
 void dp(int l,int r,int c[]){
     if(v[l][r]){
         ;i<=mem[l][r][];i++) c[i]=mem[l][r][i];
         return;
     }
     v[l][r]=;
     memset(mem[l][r],,sizeof(mem[l][r]));
     if(l==r){
         ];M(t);
         change(data[l],mem[l][r]);
         C(mem[l][r],ppow[m],t);
         ;i<=t[];i++) mem[l][r][i]=c[i]=t[i];
         return;
     }
     ],t3[],t4[],ll[],rr[];
     M(t2);dp(l+,r,t2);
     M(t3);change(data[l],t3);
     M(t4);C(t3,ppow[m-r+l],t4);
     M(ll);ADD(t2,t4,ll);
     M(t2);dp(l,r-,t2);
     M(t3);change(data[r],t3);
     M(t4);C(t3,ppow[m-r+l],t4);
     M(rr);ADD(t2,t4,rr);
     if(BIGGER(ll,rr)){
         ;i<=ll[];i++) c[i]=mem[l][r][i]=ll[i];
     };i<=rr[];i++) c[i]=mem[l][r][i]=rr[i];
     return;
 }
 void calcppow(){
     M(ppow);
     ppow[][]=;ppow[][]=;
     ];two[]=;two[]=;
     ;i<=;i++) C(ppow[i-],two,ppow[i]);
 }
 int main()
 {
     calcppow();
     ],t[],t2[];memset(ans,,sizeof(ans));
     scanf("%d%d",&n,&m);
     ;i<=n;i++){
         ;j<=m;j++){
             scanf("%d",&data[j]);
         }
         memset(t,,sizeof(t));
         memset(v,,sizeof(v));
         M(mem);
         dp(,m,t);
         M(t2);ADD(ans,t,t2);
         ;i<=t2[];i++) ans[i]=t2[i];
     }
     print(ans);
     ;
 }

NOIP2007 矩阵取数游戏的更多相关文章

  1. NOIP2007 矩阵取数游戏(区间DP)

    传送门 这道题第一眼看上去可能让人以为是贪心……不过贪心并不行,因为每次的操作是有2的幂次方的权值的.这样的话直接每次贪心最小的就目光短浅.所以那我们自然想到了DP. 据说这是一道很正常的区间DP? ...

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

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

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

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

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

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

  5. 矩阵取数游戏 NOIP 2007

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

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

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

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

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

  8. 洛谷 P1005 矩阵取数游戏

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

  9. codevs1166 矩阵取数游戏

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

随机推荐

  1. xloader

    [1],先看一下整个系统的结构(软件是灵魂,硬件是驱体,再强大的灵魂力若没有躯体终将是游魂野鬼,再强壮的驱体若没有灵魂终将是植物人) 结构 作用 备注 硬件 一切软件的载体   xloader 引导u ...

  2. NOIP2016报零记

    其实,NOIP2016已经于10天之前就结束了,但是由于种种原因,没有写总结. 现在就来填上这个坑吧. DAY1: T1:一道简(kun)单(nan)的模拟,虽然ac,但是考试的时候总觉得怪怪的.并且 ...

  3. 11.12模拟考T2(GCD)

    2.梅花桩   (blossom.pas/c/cpp) [问题描述] 小x在练习一门轻功,这门轻功是在梅花桩上跳来跳去,这门轻功是严格按照直线从一个梅花桩直接跳到另外一个梅花桩上.因为小x有恐高症,所 ...

  4. Linux测试环境部署tomcat(二)

    安装配置tomcat 1:在http://tomcat.apache.org/download-80.cgi下载最新安装包 2:安装tomcat 将apache-tomcat-8.0.21.tar.g ...

  5. 开发adobe ane分享

    最近的项目使用adobe air开发,不可能避免的要使用到ane,项目初期的时候,使用了网上搜索到的了一些开源ane,最后发现,很多都不完善,要么版本太久,要么BUG很多,无人维护,所以下决心自己开发 ...

  6. .Net WebApi 实现OAuth2.0认证

    现在多数公众平台提供的api都使用OAuth2.0认证模式,最近在搞Android方面的开发,身份认证和权限控制的各方面比较来说,使用OAuth认证的还是比较靠谱,OAuth2.0的协议可以参考htt ...

  7. Python之路,day12-Python基础

    Mysql数据库操作 数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据 ...

  8. JDK、JRE、JVM

    首先来说一下JDKJDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK).JDK是整个JAVA的核心,包括了Java运行环境(Java Runtime Env ...

  9. MSSQL-实用小工具

    1.创建查询辅助表 create table nums (n int not null) alter table nums add constraint PK_NUMS primary key clu ...

  10. 13、java中的多态

    1,多态的体现 父类的引用指向了自己的子类对象. 父类的引用也可以接收自己的子类对象.2,多态的前提 必须是类与类之间有关系.要么继承,要么实现. 通常还有一个前提:存在覆盖. 3,多态的好处 多态的 ...