RT。
不开O2能AC
开了反而WA
在IDE上测式后发现程序中的循环是一个也没有进,不是很能理解,求大佬解答。
↓↓代码↓↓
#include<bits/stdc++.h>
using namespace std;
const int len_arr=15;
const int MOD=10000;//压四位高精
struct HACC{
int f,dig,bit[len_arr];//f-正负号;dig-位数;bit[]-每位
friend HACC operator + (HACC x,HACC y);
friend HACC operator - (HACC x,HACC y);
friend HACC operator * (HACC x,HACC y);
friend bool operator < (HACC x,HACC y);
friend bool operator == (HACC x,HACC y);
void clear(){
f=1;
dig=1;
for(int i=1;i<=len_arr;i++)
bit[i]=0;
}
void input(){//快读
clear();
dig--;
int idig=0,iA[len_arr<<2];
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
iA[++idig]=ch^48;
ch=getchar();
}
for(int i=1;(i<<1)<=idig;i++){
int c=iA[i];
iA[i]=iA[idig-i+1];
iA[idig-i+1]=c;
}
iA[idig+1]=iA[idig+2]=iA[idig+3]=iA[idig+4]=0;
for(int i=1;i<=idig;i+=4)
bit[++dig]=iA[i]+iA[i+1]*10+iA[i+2]*100+iA[i+3]*1000;
}
void output(){
if(dig==1&&!bit[1]) f=1;//为0时去掉负号
if(f==-1) putchar('-');
for(int i=dig;i>=1;i--){
if(i==dig) printf("%d",bit[i]);
else{
if(bit[i]<=9) putchar('0');
if(bit[i]<=99) putchar('0');
if(bit[i]<=999) putchar('0');
printf("%d",bit[i]);
}
}
}
friend bool operator < (HACC x,HACC y){//小于
if(x.f==y.f){
if(x.f*x.dig<y.f*y.dig) return true;
if(x.f*x.dig>y.f*y.dig) return false;
for(int i=x.dig;i>=1;i--){
if(x.f*x.bit[i]<y.f*y.bit[i]) return true;
if(x.f*x.bit[i]>y.f*y.bit[i]) return false;
}
return false;//相等
}
else if(x.f==-1) return true;
return false;
}
friend bool operator == (HACC x,HACC y){//等于
if(x.f==y.f){
if(x.f*x.dig!=y.f*y.dig) return false;
for(int i=x.dig;i>=1;i--)
if(x.f*x.bit[i]!=y.f*y.bit[i]) return false;
return true;//相等
}
else return false;
}
friend HACC operator + (HACC x,HACC y){//加法
HACC res;
res.clear();
if(x.f==y.f){
int crr=0,mdig=max(x.dig,y.dig);//crr-进位
res.f=x.f;
for(int i=1;i<=mdig;i++){
res.bit[i]=x.bit[i]+y.bit[i]+crr;
crr=res.bit[i]/MOD;
res.bit[i]%=MOD;
}
if(crr) res.bit[++mdig]=crr;
res.dig=mdig;
}
else{
if(x.f==-1){
x.f=1;
res=y-x;
}
else{
y.f=1;
res=x-y;
}
}
return res;
}
friend HACC operator - (HACC x,HACC y){//减法
HACC res;
res.clear();
if(x.f==y.f){
res.f=x.f;
int bor=0,mdig=max(x.dig,y.dig);
if(x<y) swap(x,y),res.f*=-1;
for(int i=1;i<=mdig;i++){
res.bit[i]=x.bit[i]-bor-y.bit[i];
bor=0;
if(res.bit[i]<0){
bor=1;
res.bit[i]+=MOD;
}
}
res.dig=mdig;
while(!res.bit[res.dig]&&res.dig>=2) res.dig--;//去前导0
}
else{
if(x.f==-1){
y.f=-1;
res=x+y;
}
else{
y.f=1;
res=x+y;
}
}
return res;
}
friend HACC operator * (HACC x,HACC y){//乘法
HACC res;
res.clear();
res.f=x.f*y.f;
int mdig=x.dig+y.dig;
for(int i=1;i<=x.dig;i++){
int arr=0;
for(int j=1;j<=y.dig;j++){
res.bit[i+j-1]+=x.bit[i]*y.bit[j]+arr;
arr=res.bit[i+j-1]/MOD;
res.bit[i+j-1]%=MOD;
}
if(arr) res.bit[i+y.dig]=arr;
}
res.dig=mdig;
while(!res.bit[res.dig]&&res.dig>=2) res.dig--;//去前导0
return res;
}
};
HACC StoH(int x){//单精度转化为高精度
HACC res;
int idig=0,iA[len_arr<<2];
res.dig=0;
res.f=1;
if(x<0) res.f=-1,x*=-1;
else if(x==0){
res.dig=1;
return res;
}
while(x){
iA[++idig]=x%10;
x/=10;
}
iA[idig+1]=iA[idig+2]=iA[idig+3]=iA[idig+4]=0;
for(int i=1;i<=idig;i+=4)
res.bit[++res.dig]=iA[i]+iA[i+1]*10+iA[i+2]*100+iA[i+3]*1000;
return res;
}
HACC maxn(HACC x,HACC y){//取较大值
if(x<y) return y;
return x;
}
HACC minn(HACC x,HACC y){//取较小值
if(x<y) return x;
return y;
}
int n,m;
HACC ans,power2[100],a[100],dp[100][100];
void init()
{
ans.clear();
power2[0].f=1;
power2[0].bit[1]=1;
power2[0].dig=1;
for(int i=1;i<=m;i++)
power2[i]=power2[i-1]*StoH(2);
}
void initdp()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
dp[i][j].clear();
for(int i=1;i<=m;i++)
dp[i][i]=a[i]*power2[m];
}
int main()
{
scanf("%d%d",&n,&m);
init();
for(int q=1;q<=n;q++)
{
for(int j=1;j<=m;j++)
a[j].input();
initdp();
for(int len=2;len<=m;len++)
{
for(int i=1;i+len-1<=m;i++)
{
int j=i+len-1,t=m-len+1;//t即取得时的次数
dp[i][j].clear();
dp[i][j]=maxn(dp[i+1][j]+power2[t]*a[i],dp[i][j-1]+power2[t]*a[j]);
}
}
ans=ans+dp[1][m];
}
ans.output();
return 0;
}
↑↑代码↑↑