题目链接

  yeah终于过辣!

  DP,f[i][j]表示每行还剩i到j这个区间的数没取的时候的值。借这个题我也把高精度的短板弥补了一下,以后高精加高精乘应该是没问题了。

  哇终于不怂高精了……

  放上代码。

  

#include<cstdio>
#include<cctype>
#include<iostream>
#include<cstring> inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} struct BigInteger{
int s[],len;
BigInteger(){ len=; memset(s,,sizeof(s)); } bool operator >(BigInteger a){
if(len!=a.len) return len>a.len;
for(int i=len;i;--i){
if(s[i]!=a.s[i]) return s[i]>a.s[i];
}
return ;
} bool operator ==(BigInteger a){
if(len!=a.len) return ;
for(int i=;i<=len;++i)
if(s[i]!=a.s[i]) return ;
return ;
} bool operator <(BigInteger a){
return (!(*this>a)&&!(*this==a));
} BigInteger operator =(char* d){
int size=strlen(d+);
(*this).len=size;
for(int i=size,tot=;tot<size;--i) (*this).s[++tot]=d[i]-'';
return *this;
} BigInteger operator =(int num){
char d[];
sprintf(d+,"%d",num);
*this=d;
return *this;
} inline void out(){
for(register int i=len;i;--i) printf("%d",s[i]);
} BigInteger operator +(BigInteger a){
BigInteger ans;
ans.len=;
int size=std::max(len,a.len);
for(int i=,g=;g||i<=size;++i){
int now=s[i]+a.s[i]+g;
ans.s[++ans.len]=now%;
g=now/;
}
return ans;
} BigInteger in(){
char d[];
scanf("%s",d+);
*this=d;
return *this;
} BigInteger operator *(BigInteger a){
BigInteger ans;
ans.len=;
int size=len+a.len;
for(int i=;i<=len;++i)
for(register int j=;j<=a.len;++j)
ans.s[i+j-]+=s[i]*a.s[j];
for(int i=;i<size;++i){
ans.s[i+]+=ans.s[i]/;
ans.s[i]%=;
}
while(size>&&!ans.s[size]) size--;
ans.len=size;
return ans;
} }; BigInteger Pow(BigInteger a,int b){
if(b==) return a;
BigInteger ret;
ret=;
while(b){
if(b&) ret=ret*a;
a=a*a;
b>>=;
}
return ret;
} BigInteger f[][];
BigInteger d[][];
BigInteger ans;
BigInteger two;
int main(){
two=;ans=;
int n=read(),m=read();
for(int i=;i<=n;++i)
for(int j=;j<=m;++j) d[i][j]=read();
for(int T=;T<=n;++T){
memset(f,,sizeof(f));
for(int len=m;len;--len){
BigInteger Powval;Powval=Pow(two,m-len);
for(int i=;i+len-<=m;++i){
int j=i+len-;
if(j<m&&f[i][j+]+Powval*d[T][j+]>f[i][j]) f[i][j]=f[i][j+]+Powval*d[T][j+];
if(i>&&f[i-][j]+Powval*d[T][i-]>f[i][j]) f[i][j]=f[i-][j]+Powval*d[T][i-];
}
}
BigInteger Max;Max=;
BigInteger Powval=Pow(two,m);
for(int i=;i<=m;++i)
if(Max<f[i][i]+Powval*d[T][i]) Max=f[i][i]+Powval*d[T][i];
ans=ans+Max;
}
ans.out();
return ;
}

【Luogu】P1005矩阵取数游戏(高精度+DP)的更多相关文章

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

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

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

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

  3. 洛谷P1005 矩阵取数游戏

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

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

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

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

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

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

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

  7. 洛谷 P1005 矩阵取数游戏

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

  8. 洛谷 P1005 矩阵取数游戏 (区间dp+高精度)

    这道题大部分时间都在弄高精度-- 还是先讲讲dp吧 这道题是一个区间dp,不过我还是第一次遇到这种类型的区间dp f[i][j]表示取了数之后剩下i到j这个区间的最优值 注意这里是取了i之前和j之后的 ...

  9. P1005 矩阵取数游戏(动态规划+高精度)

    题目链接:传送门 题目大意: 给定长度为m的数列aj,每次从两端取一个数,得到2k * aj的价值(k为当前的次数,从1开始到m),总共有n行这样的数列,求最大价值总和. 1 ≤ n, m ≤ 80, ...

随机推荐

  1. Spark-水库抽样-根据抽样率确定每个分区的样本大小

    /* * 输入:采样率,待采样的RDD * 输出:每个分区的样本大小(记录数) * 由采样率确定,每个分区的样本大小 */ def findNumPerPartition[T: ClassTag, U ...

  2. github入门之分支操作--5

    1.显示分一览表 2.创建.切换分支 2.1.切换到feature-A分支并进行提交 2.1.1.执行下面的命令,创建名为feature-A的分支 实际上,执行以命令也能收到同样的效果,但是我习惯使用 ...

  3. 系统报错undefine not symbol armv7

    libz.dylib libsqlite3.dylib libstdc++.dylib 添加这些动态链接库

  4. 使用python模拟登陆百度

    #!/usr/bin/python # -*- coding: utf- -*- """ Function: Used to demostrate how to use ...

  5. UVA 247 - Calling Circles (Floyd)

    互相可以打电话是一个传递关系,所以Floyd求传递封包,dfs找一个尽量大的圈. #include<bits/stdc++.h> using namespace std; ; map< ...

  6. HDU 4347 The Closest M Points (kdTree)

    赤果果的kdTree. 学习传送门:http://www.cnblogs.com/v-July-v/archive/2012/11/20/3125419.html 其实就是二叉树的变形 #includ ...

  7. 数学题 追及相遇—HDOJ1275 人傻需要多做题

    两车追及或相遇问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  8. java 读取文件转换成字符串

    public String readFromFile(File src) { try { BufferedReader bufferedReader = new BufferedReader(new ...

  9. vue 不支持 数组Array,只支持get set push,但是正是做tab的时候,用到splice,就都不好用了,最后用v-if,从新渲染 完美解决

    vue 不支持 数组Array,只支持get set push,但是正是做tab的时候,用到splice,就都不好用了,最后用v-if,从新渲染 完美解决

  10. null 理解

    值 null 特指对象的值未设置.它是 JavaScript 基本类型 之一. 语法节 null 描述节 值 null 是一个字面量,它不像undefined 是全局对象的一个属性.null 是表示缺 ...