萌新刚学OI,不知道为什么只得了40分。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
class LargeInt{
private:
int len;
int digit[55];
public:
void INIT(){
len=0;
memset(digit,0,sizeof(digit));
}
void get(int x){
INIT();
if(x==0){
len=1;
return ;
}
while(x){
digit[len++]=x%10;
x/=10;
}
}
void put(){
for(register int i=len-1;i>=0;i--){
printf("%d",digit[i]);
}
printf("\n");
}
LargeInt operator +(const LargeInt& b){
LargeInt ret;
ret.INIT();
ret.len=max(this->len,b.len);
for(register int i=0;i<ret.len;i++){
ret.digit[i]+=this->digit[i]+b.digit[i];
ret.digit[i+1]+=ret.digit[i]/10;
ret.digit[i]%=10;
}
while(ret.digit[ret.len]){
ret.len++;
}
return ret;
}
LargeInt operator *(const LargeInt& b){
LargeInt ret;
if((this->len==1&&this->digit[0]==0)||(b.len==1&&b.digit[0]==0)){
ret.get(0);
return ret;
}
ret.INIT();
ret.len=this->len+b.len-2;
for(register int i=0;i<this->len;i++){
for(register int j=0;j<b.len;j++){
ret.digit[i+j]+=this->digit[i]*b.digit[j];
for(register int k=0;k<ret.len;k++){
ret.digit[k+1]+=ret.digit[k]/10;
ret.digit[k]%=10;
}
}
}
while(ret.digit[ret.len]){
ret.len++;
}
return ret;
}
bool operator <(const LargeInt& b){
if(this->len<b.len){
return 1;
}else if(b.len<this->len){
return 0;
}
for(register int i=this->len-1;i>=0;i--){
if(this->digit[i]==b.digit[i]){
continue;
}else if(this->digit[i]<b.digit[i]){
return 1;
}else{
return 0;
}
}
return 0;
}
};
int n,m;
LargeInt ans;
LargeInt a[85],dp[85][85];
inline LargeInt max(LargeInt a,LargeInt b){
if(a<b){
return b;
}
return a;
}
inline LargeInt pow(int p,int q){
LargeInt ret,Largep;
Largep.get(p);
ret.get(1);
for(register int i=1;i<=q;i++){
ret=ret*Largep;
}
return ret;
}
inline void IN(){
for(register int i=1;i<=m;i++){
int x;
scanf("%d",&x);
a[i].get(x);
}
}
inline void DP(){
for(register int k=2;k<=m;k++){
for(register int l=1;l+k-1<=m;l++){
dp[l][k].get(0);
}
}
for(register int l=1;l<=m;l++){
dp[l][1]=a[l]*pow(2,m);
}
for(register int k=2;k<=m;k++){
const int i=m-k+1;
for(register int l=1;l+k-1<=m;l++){
dp[l][k]=max(dp[l][k-1]+a[l+k-1]*pow(2,i),dp[l+1][k-1]+a[l]*pow(2,i));
}
}
}
inline void RENEWANS(){
ans=ans+dp[1][m];
}
int main(){
ans.INIT();
scanf("%d %d",&n,&m);
for(register int i=1;i<=n;i++){
IN();
DP();
RENEWANS();
}
ans.put();
return 0;
}