题目描述

帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的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. puppet组织架构

    树结构如下: |-- puppet.conf #主配置配置文件 |-- fileserver.conf #文件服务器配置文件 |-- auth.conf #认证配置文件 |-- autosign.co ...

  2. Java和Python运行速度对比

    Java和Python运行速度对比:同一个函数运行一百万次,Java耗时0.577秒,Python耗时78秒--135倍的差距. 版本:Java 8,Python 2.7.10 Java测试代码: i ...

  3. i++和++i的深入理解

    研究了很久,对这个一直很模糊.相信大家,看完这篇文章,会有更深一层的认识! 一直以来,++ --语法浪费了太多人的时间.说句实在话,++ -- 在C语言中其实是一个很细节的语法,除了表达简练外,真的没 ...

  4. windows下的unix工具集:UnxUtils

    参考: http://blog.csdn.net/woohello/article/details/8365639 下载: http://sourceforge.net/projects/unxuti ...

  5. html css js

    html 回顾 字体:font 属性: color: 颜色 size: 字号 表格:table 标签: tr:表格中的行 td: 单元行中的单元格 th:通常使用在table中的第一行, 成为表头, ...

  6. #define 的一些用法 以及 迭代器的 [] 与 find()函数的区别

    #include "stdafx.h" #include <map> #include <string> #include <iostream> ...

  7. Java for LeetCode 024 Swap Nodes in Pairs

    Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2-& ...

  8. HDU 1087 Super Jumping! Jumping! Jumping! 最大递增子序列

    Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  9. fedora 损坏,开机出现GRUB 2 启动提示符

    如果设置不当,GRUB 2 可能会加载失败,随后进入启动提示符中.要解决此问题,按如下步骤执行: 1. 列出 GRUB 2 识别的驱动器: grub2> ls 2. 对于一个含有三个分区的 do ...

  10. (*p)++和*(p++)和*p++的区别

    * 和++优先级是同一级别,同一级别按照从右往左的顺序计算 所以:  *p++等价于*(p++) #define debug(x) cout << #x << " a ...