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分。所以需要高精度,不过实现起来并不复杂。

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

 #include<cstdio>
#include<cstring>
#include<algorithm>
class BigInt {
private:
static const int k=;
int num[],len;
public:
BigInt() {
memset(num,,sizeof num);
len=;
}
BigInt(const int len,const int num) {
this->len=len;
this->num[]=num;
}
BigInt operator + (const BigInt &x) const {
BigInt ans;
for(int i=;i<=(ans.len=std::max(this->len,x.len));i++) {
ans.num[i]+=this->num[i]+x.num[i];
ans.num[i+]=ans.num[i]/k;
ans.num[i]%=k;
}
if(ans.num[ans.len+]) ans.len++;
return ans;
}
BigInt operator * (const int &x) const {
BigInt ans;
for(int i=;i<=(ans.len=this->len);i++) {
ans.num[i]+=this->num[i]*x;
ans.num[i+]=ans.num[i]/k;
ans.num[i]%=k;
}
if(ans.num[ans.len+]) ans.len++;
return ans;
}
bool operator < (const BigInt &x) const {
if(this->len<x.len) return true;
if(this->len>x.len) return false;
for(int i=this->len;i>=;i--) {
if(this->num[i]<x.num[i]) return true;
if(this->num[i]>x.num[i]) return false;
}
return false;
}
BigInt& operator = (const BigInt &x) {
this->len=x.len;
std::copy(&x.num[],&x.num[len+],this->num);
return *this;
}
void print() {
printf("%d",num[len]);
for(int i=len-;i>=;i--) {
printf("%04d",num[i]);
}
printf("\n");
}
};
const int M=;
BigInt pow[M]={BigInt(,)};
void calcpow(const int x) {
pow[x]=pow[x-]*;
}
int main() {
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++) calcpow(i);
BigInt ans;
while(n--) {
int a[m];
BigInt f[m+][m+];
for(int i=;i<m;i++) scanf("%d",&a[i]);
memset(f,,sizeof f);
BigInt max;
for(int i=;i<=m;i++) {
for(int j=;j<=m-i;j++) {
if(i) f[i][j]=std::max(f[i][j],f[i-][j]+pow[i+j]*a[i-]);
if(j) f[i][j]=std::max(f[i][j],f[i][j-]+pow[i+j]*a[m-j]);
}
max=std::max(max,f[i][m-i]);
}
ans=ans+max;
}
ans.print();
return ;
}

[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. Linux MMC framework2:基本组件之core

    1.前言 本文主要core组件的主要流程,在介绍的过程中,将详细说明和core相关的流程,涉及到其它组件的详细流程再在相关文章中说明. 2.主要数据结构和API TODO 3. 主要流程 3.1 mm ...

  2. Linux内核调试方法【转】

    转自:http://www.cnblogs.com/shineshqw/articles/2359114.html kdb:只能在汇编代码级进行调试: 优点是不需要两台机器进行调试. gdb:在调试模 ...

  3. C:malloc/calloc/realloc/alloca内存分配函数

    原文地址:http://www.cnblogs.com/3me-linux/p/3962152.html calloc(), malloc(), realloc(), free(),alloca() ...

  4. centos系统初始化脚本

    #!/bin/bash #检测是否为root用户 ];then echo "Must be root can do this." exit fi #检测网络 echo " ...

  5. Project Euler Problem 10

    Summation of primes Problem 10 The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. Find the sum of ...

  6. 005_nginx414_nginx 414 Request-URI Too Large

    一.开发请求一个非常长的请求参数 https://jiaju.jyall.me/backend/dish/getSales/?dishId=167271&dishId=166975&d ...

  7. angularjs入门(二)

    angularJs是一个mvc模式, m-model-->当前视图中可用的数据, v-view--> HTML. c-controller-->即 JavaScript 函数,可以添 ...

  8. ocos2d-x 3.0坐标系详解--透彻篇 ---- convertToWorldSpace:把基于当前节点的本地坐标系下的坐标转换到世界坐标系中。

    convertToWorldSpace:把基于当前节点的本地坐标系下的坐标转换到世界坐标系中.重点说明:基于...   不一定要是真实的,  convertToWorldSpace 的结果也只是一个新 ...

  9. 第一个Spring Boot程序

    Windows 10家庭中文版,java version "1.8.0_152", Eclipse Oxygen.1a Release (4.7.1a),Spring Tools ...

  10. C++ code:数值计算之矩形法求解积分问题

    积分的通常方法是将区域切割成一个个的小矩形,然后求这些小矩形的和.小矩形切割得越细,计算精度就越高,可以将切割小矩形的数量作为循环迭代变量,将前后两个不同精度下的小矩形和之差,作为逼近是否达到要求的比 ...