#include<iostream>
#include<string>
#include<cstring>
using namespace std;
inline string add(string s1,string s2)
{
string ans="";
if(s2.size()<s1.size())while(s2.size()!=s1.size())s2="0"+s2;
if(s1.size()<s2.size())while(s1.size()!=s2.size())s1="0"+s1;
int a=0,b=0,c=0;
for(int p=s2.size()-1;p>=0;p--)
{
a=s1[p]-'0',b=s2[p]-'0';
ans=char(((a+b+c)%10)+'0')+ans;
c=(a+b+c)/10;
}
if(c==1)ans="1"+ans;
return ans;
}
int a[4100],b[4100],c[4100];
inline string mul(string s1,string s2)
{
memset(a,0,sizeof(a)),memset(b,0,sizeof(b)),memset(c,0,sizeof(c));
if(s1=="0"||s2=="0")return "0";
for(int p=1;p<=s1.size();p++)a[p]=int(s1[s1.size()-p]-'0');
for(int p=1;p<=s2.size();p++)b[p]=int(s2[s2.size()-p]-'0');
for(int p=1;p<=s2.size();p++)
for(int i=1;i<=s1.size();i++)
c[p+i-1]+=a[i]*b[p];
int len=s1.size()+s2.size();
for(int p=1;p<len;p++)
if(c[p]>9)
c[p+1]+=(c[p]/10),c[p]%=10;
while(len&&!c[len])len--;
string ans="";
for(int p=len;p>=1;p--)
ans=ans+char(c[p]+'0');
return ans;
}
inline string Max(string x,string y)
{
int lx=x.size(),ly=y.size();
if(lx>ly)return x;
else if(ly>lx)return y;
else if(x==y)return x;
else
{
for(int p=0;p<lx;p++)
if(x[p]>y[p])return x;
else if(y[p]>x[p])return y;
}
}
string A[110][110],f[110][110];
int main()
{
int n,m;
string ans="0";
cin>>n>>m;
for(int p=1;p<=n;p++)
for(int i=1;i<=m;i++)
cin>>A[p][i];
for(int p=1;p<=n;p++)
{
for(int i=0;i<=m;i++)
for(int j=0;j<=m;j++)
f[i][j]="0";
for(int len=0;len<=m;len++)
for(int l=1;l+len<=m;l++)
f[l][l+len]=Max(add(mul("2",f[l+1][l+len]),mul("2",A[p][l])),add(mul("2",f[l][l+len-1]),mul("2",A[p][l+len])));
ans=add(ans,f[1][m]);
}
cout<<ans<<endl;
}
改成了高精,没压位(其实是不会)
怎么卡常啊/dk/dk/dk
字符串怎么快速输入啊/dk/dk/dk
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
inline int read(){
int x=0;bool f=0;
char ch=getchar();
while(ch<'0'||ch>'9')
f=(ch=='-'),ch=getchar();
while(ch>='0'&&ch<='9')
x=x*10+ch-'0',ch=getchar();
return f?-x:x;
}
string read_str()
{
string x="";bool f=0;
char ch=getchar();
while(ch<'0'||ch>'9')f=(ch=='-'),ch=getchar();
while(ch>='0'&&ch<='9')x=ch+x,ch=getchar();
return f?("-"+x):x;
}
string add(string s1,string s2)
{
string ans="";
if(s2.size()<s1.size())while(s2.size()!=s1.size())s2="0"+s2;
if(s1.size()<s2.size())while(s1.size()!=s2.size())s1="0"+s1;
int a=0,b=0,c=0;
for(int p=s2.size()-1;p>=0;p--)
{
a=s1[p]-'0',b=s2[p]-'0';
ans=char(((a+b+c)%10)+'0')+ans;
c=(a+b+c)/10;
}
if(c==1)ans="1"+ans;
return ans;
}
int a[4100],b[4100],c[4100];
string mul(string s1,string s2)
{
memset(a,0,sizeof(a)),memset(b,0,sizeof(b)),memset(c,0,sizeof(c));
if(s1=="0"||s2=="0")return "0";
for(int p=1;p<=s1.size();p++)a[p]=int(s1[s1.size()-p]-'0');
for(int p=1;p<=s2.size();p++)b[p]=int(s2[s2.size()-p]-'0');
for(int p=1;p<=s2.size();p++)
for(int i=1;i<=s1.size();i++)
c[p+i-1]+=a[i]*b[p];
int len=s1.size()+s2.size();
for(int p=1;p<len;p++)
if(c[p]>9)
c[p+1]+=(c[p]/10),c[p]%=10;
while(len&&!c[len])len--;
string ans="";
for(int p=len;p>=1;p--)
ans=ans+char(c[p]+'0');
return ans;
}
string Max(string x,string y)
{
int lx=x.size(),ly=y.size();
if(lx>ly)return x;
else if(ly>lx)return y;
else if(x==y)return x;
else
{
for(int p=0;p<lx;p++)
if(x[p]>y[p])return x;
else if(y[p]>x[p])return y;
}
}
string A[110][110],f[110][110];
int main()
{
int n,m;
string ans="0";
n=read(),m=read();
for(int p=1;p<=n;p++)
for(int i=1;i<=m;i++)
A[p][i]=read_str();
for(int p=1;p<=n;p++)
{
for(int i=0;i<=100;i++)
for(int j=0;j<=100;j++)
f[i][j]="0";
for(int len=0;len<=m;len++)
for(int l=1;l+len<=m;l++)
f[l][l+len]=Max(add(mul("2",f[l+1][l+len]),mul("2",A[p][l])),add(mul("2",f[l][l+len-1]),mul("2",A[p][l+len])));
ans=add(ans,f[1][m]);
}
for(int p=0;p<ans.size();p++)
putchar(ans[p]);
}
这一版是我改版输入的,结果嗯 WA 了,求大佬帮忙康康/dk/dk/dk