题目描述

帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的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. Egret白鹭H5小游戏开发入门(三)

    前言: 在上一篇文章中着重介绍了H5小游戏开发的起步阶段,如Wing面板的使用,素材的处理,类的说明等等,那么今天主要是涉及到场景的创建,loading的修改等等的代码编写. 对于这一节,我在讲解的过 ...

  2. HTML标签的嵌套

    随着时间的推移,我们学习html的基础知识有了大概的了解.而我发现,平时在写html文档的时候,发现不太清楚标签之间的嵌套规则,经常是想到什么标签就用那些,然而发现有时的标签嵌套却是错误的.通过网上找 ...

  3. 关于sharepoint2013的SPUtility.GetGenericSetupPath()方法过期解决办法

    有个时候需要读取layouts下的xml文件,因此需要知道路径,以前在SP2010用的SPUtility.GetGenericSetupPath()方法获取.现在SP2013提示过期否决 看2个结构分 ...

  4. MAPINFO中利用GridMaker工具创建栅格图层

    在工作中需要使用栅格地图,以往都是由研发人员来创建,今天偶然发现Mapinfo中有GridMaker这样一个工具,结合网络搜索自己试了一下,居然做成功了,这里把步骤记录下来,方便以后查看. 1.首先在 ...

  5. 首届Autodesk编程马拉松(Hackathon)开始报名啦 -- 6.14~15 上海

    欢迎报名参加Autodesk 首届编程马拉松 ( Hackathon ) 活动   首届Autodesk编程马拉松(Hackathon)活动即将在Autodesk公司中国研究院(上海)举办.本次编程马 ...

  6. IOS开发札记

    //遍历所有的子控件,并打印其Frame +(NSString )searchAllSubviews:(UIView )superview { NSMutableString xml = [NSMut ...

  7. Ubuntu Server 14.04升级Ubuntu Server 16.04

    Ubuntu Server 14.04升级Ubuntu Server 16.04 :转 http://blog.csdn.net/chszs 1.终端下执行命令 $ sudo apt-get upda ...

  8. App 即时通讯 SDK

    1.网易云信 http://netease.im/ 2.环信 http://www.easemob.com/customer/im 3.融云 http://www.rongcloud.cn/ 4.极光 ...

  9. Git 分支管理策略

    分支管理策略 下面我们来说一下一般企业中开发一个项目的分支策略: 主分支 master 开发分支 develop 功能分支 feature 预发布分支  release bug 分支 fixbug 其 ...

  10. 【iOS】使用CoreText实现图文混排

    iOS没有现成的支持图文混排的控件,而要用多个基础控件组合拼成图文混排这样复杂的排版,是件很苦逼的事情.对此的解决方案有使用CoreText进行绘制,或者使用TextKit.本文主要讲解对于CoreT ...