因为傻逼写错高精度搞了一下午浪费好多时间,好想哭qaq

原题:

帅帅经常更同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij据为非负整数。游戏规则如下:
  1. 每次取数时须从每行各取走一个元素,共n个。m次后取完矩阵所有的元素;
  2. 每次取走的各个元素只能是该元素所在行的行首或行尾;
  3. 每次取数都有一个得分值,为每行取数的得分之和;每行取数的得分 = 被取走的元素值*2^i,其中i表示第i次取数(从1开始编号);
  4. 游戏结束总得分为m次取数得分之和。

  帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分。

1<=n, m<=80,0<=a[i][j]<=1000

首先每一行怎么取互不影响,就可以分开来搞,最后加到一起,下面说的f,a都是某一行里的

然后每一行中区间DP,f[i][j]表示i到j这个区间最大值多少,f[i][j]=max(f[i+1][j]+a[i],f[i][j-1]+a[j])*2

在求f[i][j]的时候直接在后面*2,这样子就不用计算2^i的高精度运算

高精度傻逼了一下午,能力会随着时间的推移降低

记录傻逼的高精度错误:
//for(int i=1;i<=x[0];i++)  x[i]=f[_left][_right][i]+z;高精度+单精度不是这么写的qaq

正确做法:x[1]+=z

while(x[x[0]+1]){  x[0]++;  x[x[0]+1]+=x[x[0]]/ss,x[x[0]]%=ss;}//如果没有每次都清空的话,会因为上一次遗留下来的数继续往后推

//for(int i=1;i<=nleft[0];i++)if(nleft[i]!=nright[i])  return nleft[i]>nright[i];高精度比较应该先比高位qaq

代码:

 //因为高精度傻逼了搞了一下午,好想哭qaq
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int ss=;
int m,n,a[][];
int ans[];
int f[][][];
int nleft[],nright[];
void getn(int *x,int _left,int _right,int z){
x[]=f[_left][_right][];
//for(int i=1;i<=x[0];i++) x[i]=f[_left][_right][i]+z;傻逼了qaq
for(int i=;i<=x[];i++) x[i]=f[_left][_right][i];
x[]+=z;
for(int i=;i<=x[];i++) x[i+]+=x[i]/ss,x[i]%=ss;
while(x[x[]+]){ x[]++; x[x[]+]+=x[x[]]/ss,x[x[]]%=ss;}//注意这里,如果没有每次都清空的话,会因为上一次遗留下来的数继续往后推
}
bool getmax(){
if(nleft[]>nright[]) return true;
if(nleft[]<nright[]) return false;
//for(int i=1;i<=nleft[0];i++)if(nleft[i]!=nright[i]) return nleft[i]>nright[i];第二次傻逼qaq
for(int i=nleft[];i>=;i--)if(nleft[i]!=nright[i]) return nleft[i]>nright[i];
return true;
}
void fan(int *x){
for(int i=;i<=x[];i++) x[i]<<=;
for(int i=;i<=x[];i++) x[i+]+=x[i]/ss,x[i]%=ss;
while(x[x[]+]){ x[]++; x[x[]+]+=x[x[]]/ss,x[x[]]%=ss;}
}
void jia(int *x,int *y){
x[]=max(x[],y[]);
for(int i=;i<=x[];i++) x[i]+=y[i];
for(int i=;i<=x[];i++) x[i+]+=x[i]/ss,x[i]%=ss;
while(x[x[]+]){ x[]++; x[x[]+]+=x[x[]]/ss,x[x[]]%=ss;}
}
void copy(int *x,int *y){ y[]=x[]; for(int i=;i<=x[];i++) y[i]=x[i];}
int main(){//freopen("ddd.in","r",stdin);
//freopen("ddd.out","w",stdout);
cin>>m>>n;
for(int i=;i<=m;i++) for(int j=;j<=n;j++) scanf("%d",&a[i][j]);
for(int k=;k<=m;k++){
memset(f,,sizeof(f));
for(int i=;i<=n;i++) f[i][i][f[i][i][]=]=a[k][i]*;//因为输入数据保证a[i][j]<=1000所以直接塞进去就行了
for(int l=;l<=n;l++)
for(int i=,j=i+l-;j<=n;i++,j++){
memset(nleft,,sizeof(nleft)),memset(nright,,sizeof(nright));
getn(nleft,i+,j,a[k][i]),getn(nright,i,j-,a[k][j]);
//cout<<nleft[0]<<endl;
copy((getmax() ? nleft : nright),f[i][j]);
fan(f[i][j]);
/*cout<<f[i][j][f[i][j][0]];
for(int t=f[i][j][0]-1;t>=1;t--) printf("%04d",f[i][j][t]);
cout<<endl;*/
}
jia(ans,f[][n]);
}
cout<<ans[ans[]];
for(int i=ans[]-;i>=;i--) printf("%04d",ans[i]);
cout<<endl;
return ;
}

【NOIP2007】矩阵取数的更多相关文章

  1. NOIP2007 矩阵取数游戏

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

  2. NOIP2007矩阵取数[DP|高精度]

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

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

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

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

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

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

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

  6. [NOIP2007] 提高组 洛谷P1005 矩阵取数游戏

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

  7. 洛谷1005 【NOIP2007】矩阵取数游戏

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

  8. 矩阵取数游戏 NOIP 2007

    2016-05-31 17:26:45 题目链接: NOIP 2007 矩阵取数游戏(Codevs) 题目大意: 给定一个矩阵,每次在每一行的行首或者行尾取一个数乘上2^次数,求取完最多获得的分数 解 ...

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

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

随机推荐

  1. 在oracle中创建空间索引

    Oracle spatial可以方便的存储空间数据,大量的空间数据必需要使用空间索引去查询.在oracle中创建空间索引必需先建立元数据,否则无法创建索引.创建元数据的代码: insert into ...

  2. 关键字const

    const关键字常和指针一起使用. 1,const给读代码的人传达非常有用的信息.比如一个函数的参数是const char *,你在调用这个函数时就可以放心地传给它char *或const char ...

  3. 用VNC远程图形化连接Linux桌面的配置方法

    首先下载到vnc的linux版本和windows版本. 1. 首先,我们要先下载 VNC 安装,假如我们下载的目录是 VNC/vncgo . # cd ~# wget http://www.realv ...

  4. HTML--5 JavaScript

    一.JavaScript简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司 ...

  5. c规范(1)

    1文件结构 头文件.h 保存文件声明 定义文件.c  程序实现 2版本标示  用注释 (1)版权信息. (2)文件名称,标识符,摘要. (3)当前版本号,作者 修改者,完成日期. (4)版本历史信息. ...

  6. 从决策树学习谈到贝叶斯分类算法、EM、HMM --别人的,拷来看看

    从决策树学习谈到贝叶斯分类算法.EM.HMM     引言 最近在面试中,除了基础 &  算法 & 项目之外,经常被问到或被要求介绍和描述下自己所知道的几种分类或聚类算法(当然,这完全 ...

  7. C++面向对象编程解决三阶矩阵相加减

    /*此处用面向对象编程*/ #include<iostream> #include<string.h> using namespace std; class Matrices ...

  8. magento -- 添加新产品时状态默认为激活,库存状态默认为有库存

    添加新产品时状态默认为激活 打开文件/app/code/core/Mage/Catalog/Model/Product/Status.php,注释掉“Please Select” /** * Retr ...

  9. .csproj文件的配置 IIS可以调试

    <ProjectExtensions> <VisualStudio> <FlavorProperties GUID="{349c5851-65df-11da-9 ...

  10. MINIX3 保护模式分析

    3.1 INTEL 保护模式概要 先要说明一个问题:不是 MINIX3 一定要设置这个保护模式,但是在 386 平台上, 引入了这个保护模式机制,MINIX3 不得不设立相关保护模式的内容.由于 38 ...