[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. ...
随机推荐
- springboot系列八、springboot整合kafka
背景: 当业务在同一时间出现高并发的时候,这个时候我们不想无限的增加服务器,但是又想提高吞吐量.这时可以考虑使用消息异步处理,进行消峰填谷:同时还可以降低耦合度.常见的消息中间件有kafka,rabb ...
- cactiez v11添加对mysql数据库、apache系统进行监控
cactiez默认已经安装了mysql监控的模板,需要我们对服务器端和被监控的mysql客户端进行配置才能生效. 被监控的Mysql客户端: 如cactiez的IP为192.168.0.8 #添加一个 ...
- 使用Eclipse创建Web Services
正文: 项目源文件: 百度云盘/博客园/project/wsServerExample/wsServerExample.rar 参考文献: http://www.ibm.com/developerwo ...
- 转载:Java的四种引用方式
原文:https://www.cnblogs.com/huajiezh/p/5835618.html Java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指 ...
- java使用正则表达式的方法从json串儿,取想要的value值
例子1: 现有json: ({"code":"200","json":["111"],"message&quo ...
- PCA和SVD最佳理解
奇异值分解(SVD)原理与在降维中的应用 https://www.cnblogs.com/pinard/p/6251584.html 最通俗易懂的PCA主成分分析推导 https://blog.csd ...
- JQ初学总结一
Jquery是最火的JavaScript库,大部分web开发都会用到就jquery,而作为初学者看了一些jq的用法总结自己的学习以增强自己的认知. 普通的javascript的缺点是:每种控件的操作方 ...
- vue系列之过渡效果
参考地址:http://cn.vuejs.org/v2/guide/transitions.html vue2.0,要想实现过渡效果,要用transition组件 代码: <div id=&qu ...
- python易错题之lambda 以及 for循环中内嵌函数
li = [] for x in range(10): print(x) //在函数没有执行前(li[0]()),for 循环中x已经执行完,x会一直为 9 def fun(): print(x) / ...
- 【C++ Primer | 15】C++虚函数表剖析②
多重继承 下面,再让我们来看看多重继承中的情况,假设有下面这样一个类的继承关系. 注意:子类只overwrite了父类的f()函数,而还有一个是自己的函数(我们这样做的目的是为了用g1()作为一个标记 ...