萌新刚学 OI,求助卡常/dk/dk/dk
查看原帖
萌新刚学 OI,求助卡常/dk/dk/dk
298549
SIXIANG32楼主2021/1/31 15:07
#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

2021/1/31 15:07
加载中...