题目描述

帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的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. wordpress工作原理

    WP初始化的过程:当你输入<yourlink>/wordpress对wordpress进行初始化时,wordpress默认会找根目录下的index.php页面,看一下index.php页面 ...

  2. ICMP-type对应表

    一次在某个防火墙配置策略里看到如下的代码: iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT iptables -A FORWARD -p icmp ...

  3. 同时运行多个scrapy爬虫的几种方法(自定义scrapy项目命令)

    试想一下,前面做的实验和例子都只有一个spider.然而,现实的开发的爬虫肯定不止一个.既然这样,那么就会有如下几个问题:1.在同一个项目中怎么创建多个爬虫的呢?2.多个爬虫的时候是怎么将他们运行起来 ...

  4. What is the difference between provider network and self-service network in OpenStack?

    "self-service networking" allows users to create their own virtual networks, subnets, rout ...

  5. ASP.NET MVC 入门系列教程

    ASP.NET MVC 入门系列教程 博客园ASP.NET MVC 技术专题 http://kb.cnblogs.com/zt/mvc/ 一个居于ASP.NET MVC Beta的系列入门文章,有朋友 ...

  6. Android简易数据存储之SharedPreferences

    Andorid提供了多种数据存储的方式,例如前面说到的“Android数据存储之SQLite的操作”是用于较复杂的数据存储.然而,如果有些简单的数据存储如果采用SQLite的方式的话会显得比较笨重.例 ...

  7. 【JAVA、C++】 LeetCode 008 String to Integer (atoi)

    Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...

  8. python 将pdf分页后插入至word中

    所用技术 1. python编程基础 2. 使用pyPdf 3. 使用python操作word 4. 正则表达式的使用 5. windows的bat编程 下面是一个pyPdf库使用的示例: from ...

  9. 2.django笔记之缓存,session,cookie,ajax

    一.django缓存 1.缓存 缓存的意义在于把昂贵的计算结果保存起来一遍下次的访问,有缓存的站点的流程大概是这样子的: 给定一个url,检查页面是否在缓存中 如果在,返回缓存的页面 否则,生成该页面 ...

  10. 【python】Python标准库defaultdict模块

    来源:http://www.ynpxrz.com/n1031711c2023.aspx Python标准库中collections对集合类型的数据结构进行了很多拓展操作,这些操作在我们使用集合的时候会 ...