题目描述

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

输入输出样例

输入样例#1:

2 3
1 2 3
3 4 2
输出样例#1:

82

说明

NOIP 2007 提高第三题

-------------------------------------

DP

行与行之间相互独立,各行单独求解;一定先清空

f(i,j)左选了i个,右选了j个的最大得分

状态转移很好想,注意边界处理

高精度[这次从数组1开始]

高加高,高乘低

输出时一定小心0

建议先写出long long 的方便调试

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=;
const int B=1e4,L=; struct big{
int size,d[L];
big(int a=):size(a){memset(d,,sizeof(int)*L);}
}; void jia(big &a,big &b){
int g=,i;
for(i=;;i++){
if(g==&&i>a.size&&i>b.size) break;
int tmp=g;
if(i<=a.size) tmp+=a.d[i];
if(i<=b.size) tmp+=b.d[i];
a.d[i]=tmp%B;
g=tmp/B;
}
a.size=i-;
} void chengInt(big &a,int k){
int g=,i;
for(i=;i<=a.size;i++){
int tmp=a.d[i]*k;
a.d[i]=(tmp+g)%B;
g=(tmp+g)/B;
}
while(g){
a.d[++a.size]=g%B;
g/=B;
}
} void copy(big &t,big &s){
t.size=s.size;
for(int i=;i<=s.size;i++) t.d[i]=s.d[i];
} big max(big &a,big &b){
if(a.size>b.size) return a;
if(a.size<b.size) return b;
for(int i=a.size;i>=;i--){
if(a.d[i]>b.d[i]) return a;
if(a.d[i]<b.d[i]) return b;
}
return a;
} void print(big &a){
for(int i=a.size;i>=;i--){
if(i==a.size);
else if(a.d[i]<) cout<<"";
else if(a.d[i]<) cout<<"";
else if(a.d[i]<) cout<<"";
cout<<a.d[i];
}
cout<<"\n";
} int n,m;
int a[N][N];
big f[N][N];
big ans,fin=; big two[N];
void PRE(){
two[].d[]=;
for(int i=;i<=m+;i++){
copy(two[i],two[i-]);
chengInt(two[i],);
}
}
big sol(int num){
ans=big();
for(int i=;i<=n;i++)
for(int j=;j<=n;j++) f[i][j]=big(); f[][].d[]=a[num][]*;
f[][].d[]=a[num][m]*;
for(int i=;i<=m;i++){
// f[i][0]=f[i-1][0]+a[num][i]*((ll)1<<i);
// f[0][i]=f[0][i-1]+a[num][m-i+1]*((ll)1<<i); copy(f[i][],f[i-][]);
big tmp; copy(tmp,two[i]); chengInt(tmp,a[num][i]);
jia(f[i][],tmp); copy(f[][i],f[][i-]);
big tmp2; copy(tmp2,two[i]); chengInt(tmp2,a[num][m-i+]);
jia(f[][i],tmp2); }
for(int i=;i<=m;i++)
for(int j=;j<=m-i;j++){
// f[i][j]=max(f[i-1][j]+a[num][i]*((ll)1<<(i+j)),
// f[i][j-1]+a[num][m-j+1]*((ll)1<<(i+j))); big x,y;
copy(x,f[i-][j]);
big tmp; copy(tmp,two[i+j]); chengInt(tmp,a[num][i]);
jia(x,tmp); copy(y,f[i][j-]);
big tmp2; copy(tmp2,two[i+j]); chengInt(tmp2,a[num][m-j+]);
jia(y,tmp2); f[i][j]=max(x,y);
} for(int i=;i<=m;i++) ans=max(ans,f[i][m-i]);
return ans;
} int main(){//system("pause");
cin>>n>>m;
PRE();
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
cin>>a[i][j]; for(int i=;i<=n;i++) {big tmp=sol(i);jia(fin,tmp);}
print(fin); }

NOIP2007矩阵取数[DP|高精度]的更多相关文章

  1. [JZYZOJ 1288][洛谷 1005] NOIP2007 矩阵取数 dp 高精度

    https://www.luogu.org/problem/show?pid=1005   dp好想,高精度练手题,有点不舒服的是前后取数位置的计算,代码量太少才会写题这么慢,noip之前虽然重点放在 ...

  2. TYVJ 矩阵取数 Label:高精度+dp

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

  3. NOIP2007 矩阵取数游戏

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

  4. 51Nod 1083 矩阵取数问题(矩阵取数dp,基础题)

    1083 矩阵取数问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下 ...

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

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

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

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

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

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

  8. P1005 矩阵取数游戏 区间dp 高精度

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n \times mn×m的矩阵,矩阵中的每个元素a_{i,j}ai,j​均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n ...

  9. [LuoguP1005]矩阵取数游戏 (DP+高精度)

    题面 传送门:https://www.luogu.org/problemnew/show/P1005 Solution 我们可以先考虑贪心 我们每一次都选左右两边尽可能小的数,方便大的放在后面 听起来 ...

随机推荐

  1. 总结CSS3新特性(选择器篇)

    CSS3新增了嗯- -21个选择器,脚本通过控制台在这里运行; ~: p ~ p { color : red;/*此条规则将用于p后边所有的p...就是除了第一个p的所有p,规则同p:not(:nth ...

  2. there is no spatial analyst license available or enabled

    解决方案:右击license—属性

  3. Nmap源码分析(脚本引擎)

    Nmap提供了强大的脚本引擎(NSE),以支持通过Lua编程来扩展Nmap的功能.目前脚本库已经包含300多个常用的Lua脚本,辅助完成Nmap的主机发现.端口扫描.服务侦测.操作系统侦测四个基本功能 ...

  4. 连接QuickBooks Online实现于IOS App数据同步功能的个人记录

    公司项目需要用WebService与QBO实现后台数据同步,由于国内没有做过类似第三方产品接口的资料,前前后后找了N久,终于实现功能,现把实现功能步骤贴上来分享: QBO开发者地址(主要用于创建QBO ...

  5. Mac下载安装Android Studio教程

    今天把公司闲置的一台Mac-mini重装了下系统感觉用着速度还不错,平时上班用的机器USB有些问题,所以打算用这台Mac.以往开发用Intellij Idea就够用,但是这次项目引用的jar包太多,遭 ...

  6. 阿里资深工程师分享支付宝热补丁技术—— AndFix原理

    本文由嵌入式企鹅圈原创团队成员.阿里资深工程师Hao分享. 上次我们介绍了用dexposed方案实施热补丁的原理,它本质上就是hook要修改的函数,这样一来在正式版本发布时就不能直接拿热补丁的代码集成 ...

  7. 使用MiniProfiler给Asp.net MVC和Entity Framework号脉(附源码)

    在学习python开发框架pylons/pyramid的过程中,里面有个非常棒的页面性能监控功能,这样在开发过程中,你能清楚的知道当前页面的性能以及其它参数. 这里介绍一下如何给Asp.net MVC ...

  8. [20140928]创建连接到MySQL的连接服务器

    首先要安装 mysql odbc 然后 odbc下创建DSN,并且要在系统DSN下. 最后执行 exec sp_addlinkedserver  @server= 'XY',        --这是链 ...

  9. Linux:U盘安装Linux系统

    前天一个同学找我帮忙安装Linux系统,没有光盘,也不想在虚拟机里安装,在此情况下,我就采用U盘方式来安装Linux系统了.又想到还有其他人可能也不会 使用U盘安装系统,这里就作一个简单的介绍. 1. ...

  10. 【转载】关于Alipay支付宝接口(Java版)

    转载自:http://blog.163.com/lai_chao/blog/static/70340789201412724619514/ 1.alipay 双功能支付简介 2.alipay 提交支付 ...