[NOIp2007提高组]矩阵取数游戏
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提高组]矩阵取数游戏的更多相关文章
- [NOIP2007] 提高组 洛谷P1005 矩阵取数游戏
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- 矩阵取数游戏 2007年NOIP全国联赛提高组(dp+高精)
矩阵取数游戏 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description [问题描述]帅帅经常跟 ...
- NOIP2007 矩阵取数游戏
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- 洛谷1005 【NOIP2007】矩阵取数游戏
问题描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- 1166 矩阵取数游戏[区间dp+高精度]
1166 矩阵取数游戏 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description [ ...
- 矩阵取数游戏 NOIP 2007
2016-05-31 17:26:45 题目链接: NOIP 2007 矩阵取数游戏(Codevs) 题目大意: 给定一个矩阵,每次在每一行的行首或者行尾取一个数乘上2^次数,求取完最多获得的分数 解 ...
- 洛谷 P1005 矩阵取数游戏
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- codevs1166 矩阵取数游戏
题目描述 Description [问题描述] 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m 的矩阵,矩阵中的每个元素aij均 为非负整数.游戏规则如下: 1. 每次取数时须从每行各取走一个 ...
- 矩阵取数游戏洛谷p1005
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
随机推荐
- centos6安装python3.6.4
安装Python依赖包: [root@Python src]# yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlit ...
- BootStrap学习从现在开始
前言 原文链接 http://aehyok.com/Blog/Detail/6.html 当下最流行的前端开发框架Bootstrap,可大大简化网站开发过程,从而深受广大开发者的喜欢.本文总结了Boo ...
- 026_关于shell中的特殊变量$0 $n $* $@ $! $?
一. $n:获取当前执行的shell脚本的第N个参数,n=1..9,当n为0时表示脚本的文件名,如果n大于9,用大括号括起来like${10}. $*:获取当前shell的所有参数,将所有的命令行参数 ...
- zabbix监控短信息接口是否正常
1.创建Web scenarios 2.创建zabbix触发器name:short_message send status is not 100 Expression:{u04zbx01.yaya.c ...
- centos6.7环境半虚拟化软件xen及xm配置工具使用详解
1.xen软件的安装及配置 环境准备: ①操作系统:centos6.7(注意最好使用centos6.7,centos6.5无法使用xen的图形化界面创建操作系统) ②调整虚拟机配置,内存4G(推荐2G ...
- CentOs 6.6里kdump启动失败的原因
在VMware中新安装了CentOs 6.6,重启系统发现kdump服务启动失败 先来说一下,什么是kdump kdump 是一种先进的基于 kexec 的内核崩溃转储机制.当系统崩溃时,kdump ...
- OCM_第二天课程:Section1 —》配置 Oracle 网络环境
注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...
- laravel migrate 指定执行部分 migration
由于我不习惯于使用 laravel migration 来管理数据表变更,所以很多项目都是无法直接执行 php artisan migrate 否则会报错 SQLSTATE[42S01]: Base ...
- poj2823 单调队列初步
什么是单调队列:头元素一直是队列当中的最大值,队列中的值按照递减顺序排列,可以从末尾插入一个元素,或从两段删除元素 1.插入元素,为了保证队列的单调性(这里假设为递减性),在插入元素v时要将对位的元素 ...
- 基于TCPCopy的仿真压测方案
一.tcpcopy工具介绍 tcpcopy 是一个分布式在线压力测试工具,可以将线上流量拷贝到测试机器,实时的模拟线上环境,达到在程序不上线的情况下实时承担线上流量的效果,尽早发现 bug,增加上线信 ...