题目描述

帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的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. 百度图片爬虫-python版

               self.browser=imitate_browser.BrowserBase()            self.chance=0            self.chanc ...

  2. MySQL之扩展(触发器,存储过程等)

    视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT * FROM ( SEL ...

  3. [BZOJ]1016 JSOI2008 最小生成树计数

    最小生成树计数 题目描述 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同 ...

  4. Android中自定义Activity和Dialog的位置大小背景和透明度等demo

    1.自定义Activity显示样式 先在res/values下建colors.xml文件,写入: <?xml version="1.0" encoding="utf ...

  5. 【Hadoop】Hive HSQ 使用 && 自定义HQL函数

    4 HQL 4.1 官网 4.1.1 https://cwiki.apache.org/confluence/display/Hive/LanguageManual 4.1.2 性能调优 4.1.2. ...

  6. 70 数组的Kmin算法和二叉搜索树的Kmin算法对比

    [本文链接] http://www.cnblogs.com/hellogiser/p/kmin-of-array-vs-kmin-of-bst.html [分析] 数组的Kmin算法和二叉搜索树的Km ...

  7. 27.二元树的深度[BinaryTreeDepth]

    [题目] 输入一棵二元树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 例如 10                          ...

  8. 【转】mysql忘记root密码的解决方法

    本文收集于本人的笔记本,由于找不到原文出处.在此省略,如哪位知道可以联系我加上. 方法一:在windows下:1.打开命令行(DOS)窗口,停止mysql服务: net stop mysql 2.在D ...

  9. 在Xcode5和Android Studio添加工程间的依赖

    正在编辑中,尚未完成 先看看ios的target是什么,请先参看http://www.cocoachina.com/bbs/read.php?tid-10884.html做个大概了解 这里有一篇文章, ...

  10. 11.python之线程,协程,进程,

    一,进程与线程 1.什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行 ...