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. freeRTOS中文实用教程1--任务

    1.前言 FreeRTOS是小型多任务嵌入式操作系统,硬实时性.本章主要讲述任务相关特性及调度相关的知识. 2. 任务的总体特点 任务的状态 (1)任务有两个状态,运行态和非运行态 (2)任务由非运行 ...

  2. Linux的capability深入分析(1)【转】

    转自:https://blog.csdn.net/wangpengqi/article/details/9821227 一)概述: )从2.1版开始,Linux内核有了能力(capability)的概 ...

  3. ansible报错Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this

    安装和配置好ansible,执行命令时报错如下 [root@test01 ansible-install]# ansible test -m shell -a 'w' >> Using a ...

  4. springboot系列五、springboot常用注解使用说明

    一.controller相关注解 1.@Controller 控制器,处理http请求. 2.@RespController Spring4之后新加的注解,原来返回json需要@ResponseBod ...

  5. 深入理解AsyncTask的工作原理

    一.为什么需要工作者线程 我们知道,Android应用的主线程(UI 线程)肩负着绘制用户界面和及时响应用户操作的重任,为了避免“用户点击按钮后没反应”这样的糟糕用户体验,我们就要确保主线程时刻保持着 ...

  6. ctype

    original:http://www.runoob.com/cprogramming/c-standard-library-ctype-h.html 下面列出了头文件 ctype.h 中定义的函数: ...

  7. (六)cxf处理一些Map等复杂类型

    前面讲的一些都是简单类型,cxf都支持.但是有些复杂类型,cxf是不支持,比如常用的Map类型: 下面我们在前面的实例基础上在加一个方法,比如我们现在有个需求,获取所有用用户以及对应的每个用户所有角色 ...

  8. 步步为营-66-Socket通信

    1.0 版本 1.1 服务器端 using System; using System.Collections.Generic; using System.Linq; using System.Net; ...

  9. git shell 命令大全

    常用命令 git branch 查看本地所有分支 git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支 git branch -r 查看远程所有分 ...

  10. Linux 僵尸进程的筛选和查杀

    一.筛选 ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' 二.查杀 ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' ...