题目描述

帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的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 提高第三题

代码

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100
using namespace std;
struct bigint{
int a[maxn];//a[0]存位数
bigint(){memset(a,,sizeof(a));} bigint& operator=(const string s){//字符串类的赋值
int k=;
for(int i=s.size()-;i>=;i--){
k++;
this->a[k]=s[i]-'';
}
a[]=s.size();
return *this;
}
bigint& operator=(const int s){
int num=s,i=;
while(num){
i++;
this->a[i]=num%;
num/=;
}
this->a[]=i;
return *this;
} /* bigint& operator=(const bigint &s){
memset(a,0,sizeof(a));
this->a[0]=s.a[0];
for(int i=1;i<=s.a[0];i++){
this->a[i]=s.a[i];
}
return *this;
}*/
//赋值部分结束 //运算符+
bigint operator +(const bigint b){
bigint c;
c.a[]=max(a[],b.a[]);
for(int i=;i<=c.a[];i++){
c.a[i]+=(a[i]+b.a[i]);
c.a[i+]+=c.a[i]/;
c.a[i]%=;
}
if(c.a[c.a[]+]>)
c.a[]++;
return c;
} //比较
/*bool operator <(const bigint b){
if((this->a[0])!=b.a[0]) return (this->a[0])<b.a[0];
for(int i=b.a[0];i>=1;i--){
if((this->a[0])!=b.a[i])
return (this->a[i])<b.a[i];
}
return false;
}*/ bool operator <(const bigint b){
if(this->a[]<b.a[])
return true;
if(this->a[]>b.a[])
return false;
for(int i=b.a[];i>=;i--){
if(this->a[i]!=b.a[i])
return this->a[i]<b.a[i];
}
return false;
}
bool operator >(bigint b){//不可写const,会报错
return b<(*this);
}
}; ostream& operator<<(ostream&out,const bigint a){
for(int i=a.a[];i>=;i--)
out<<a.a[i];
return out;
}
istream& operator>>(istream&in,bigint& a){//不可写const
string s;
in>>s;
a=s;
return in;
} int main(){
int n,m;
cin>>m>>n;
bigint a[];
bigint tot,f[maxn][maxn];
bigint q,p;
for(int num=;num<=m;num++){
for(int i=;i<=n;i++)
cin>>a[i];
for(int i=;i<=n;i++)//预处理
f[i][i]=a[i]+a[i]; for(int l=;l<n;l++){
for(int i=;i<=n&&i+l<=n;i++){
int j=i+l;
p=a[i]+f[i+][j];
q=a[j]+f[i][j-];
if(p<q)
f[i][j]=q+q;
else
f[i][j]=p+p;
}
}
tot=f[][n]+tot;
memset(&a,,sizeof(a));//注意&
memset(&f,,sizeof(f));
memset(&q,,sizeof(q));
memset(&p,,sizeof(p));
}
cout<<tot<<endl;
return ;
}

注释部分比较函数不可用,待查

就是一个struct版的高精度,抄自http://www.luogu.org/problem/lists

TYVJ 矩阵取数 Label:高精度+dp的更多相关文章

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

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

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

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

  3. 矩阵取数问题(dp,高精)

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

  4. P1005 矩阵取数游戏[区间dp]

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

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

    传送门 和奶牛那个题很像,每一行状态互不影响,也就是求 n 遍DP 不过高精度非常恶心,第一次写,调了我一上午. ——代码 #include <cstdio> #include <c ...

  6. TYVJ P1078 删数 Label:区间dp

    描述 有N个不同的正整数数x1, x2, ... xN 排成一排,我们可以从左边或右边去掉连续的i个数(只能从两边删除数),1<=i<=n,剩下N-i个数,再把剩下的数按以上操作处理,直到 ...

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

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

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

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

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

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

随机推荐

  1. [ruby on rails] 跟我学之(7)创建数据

    通过form来创建数据,本章节将会涉及内容:创建form,用户重导向,渲染views 和 flash消息. 1. views初步 编辑 app/views/posts/index.html.erb这个 ...

  2. JSoup——用Java解析html网页内容

    当需要从网页上获取信息时,需要解析html页面.筛选指定标签,并获取其值是必不可少的操作,解析html页面这方面的利器,Python有BeautifulSoup,Java一直没有好的工具,之前的Htm ...

  3. fsck检查和修复文件系统

    重视:fsck不能乱用.先要把文件系统umount掉,然后检查.最好启动到单用户模式下fsck. 常见的5种损坏类型 1 未被引用的inode 2 难以置信的超大链接数 3 没有记录在磁盘块映射表中的 ...

  4. Windows命令行重命名文件

    RENAME D:\Cache\xyz.html xyz%date:~0,4%%date:~5,2%%date:~8,2%.tar.gz

  5. 【转】Quartus II调用modelsim无缝仿真

    Quartus II调用modelsim无缝仿真  ★emouse 思·睿博客文章★ 原创文章转载请注明:http://emouse.cnblogs.com 本篇文章为转载,写的不错,最近在学mode ...

  6. Android文件Apk下载变ZIP压缩包解决方案

    [root@ conf]# pwd /alidata/server/nginx/conf [root@ conf]# vi mime.types application/vnd.android.pac ...

  7. Angular中的Error: [$resource:badcfg]错误如何解决之一种

    相信这种情况很多的吧,我遇到的情况是因为在作reSource的service时,query出来的协议不对. 错误时候的代码: Version.factory("versionSrv" ...

  8. 记32位Oracle客户端登录报12560协议适配器错误的解决办法

    国庆买了一台新电脑ThinkPad E431,i5双核CPU,8G内存,硬盘比较坑爹5400转的500G,重点是预装win8的64位简体中文版.大学时买了第一台电脑神舟笔记本,因为神舟电脑便宜,所以没 ...

  9. Java Hour 34 Weather ( 7 ) struts2 – validate

    有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. Hour 34 Form Validation 一般Form 提交都有验证的, ...

  10. Hierachy Viewer 使用 monitor命令

    使用 Hierachy Viewer 可视化调试工具 Hierachy Viewer 能很方便地在开发者设计,调试和调整界面时,快速定位问题,解决问题,提高开发效率. Hierarchy Viewer ...