有大佬能帮忙看一下吗?谢谢

P1005 [NOIP2007 提高组] 矩阵取数游戏

```cpp #include<iostream> #include<memory.h> #include<stdio.h> using namespace std; int n,m,a[81]; int f[81][81][31]; int ys[81][31]; int ans[31]; int c[31]; void mul(int *x,int *y,int z){ memset(c,0,sizeof(c)); c[0]=y[0]; for(int i=1;i<=c[0];++i) c[i]=y[i]*z; for(int i=1;i<=c[0];++i){ c[i+1]+=c[i]/100000; c[i]%=100000; } while(c[c[0]+1]){ c[0]++; c[c[0]+1]+=c[c[0]]/100000; c[c[0]]%=100000; } for(int i=0;i<=30;++i) x[i]=c[i]; } void add(int *x,int *y,int *z){ memset(c,0,sizeof(c)); if(y[0]>z[0]) c[0]=y[0]; else c[0]=z[0]; for(int i=1;i<=c[0];++i) c[i]=y[i]+z[i]; for(int i=1;i<=c[0];++i){ c[i+1]+=c[i]/100000; c[i]%=100000; } if(c[c[0]+1]) c[0]++; for(int i=0;i<=30;++i) x[i]=c[i]; } bool MAX(int *x,int *y){ if(x[0]>y[0]) return 1; else if(y[0]>x[0]) return 0; else{ for(int i=x[0];i>=1;--i) if(x[i]>y[i]) return 1; else if(y[i]>x[i]) return 0; } return 1; } int main() { scanf("%d%d",&n,&m); ys[0][0]=1; ys[0][1]=1; for(int i=1;i<=m;++i) mul(ys[i],ys[i-1],2); ans[0]=1; ans[1]=0; for(int i=1;i<=n;++i){ for(int j=1;j<=m;++j){ scanf("%d",&a[j]); mul(f[j][j],ys[m],a[j]); } for(int k=2;k<=m;++k) for(int lx=1;lx<=m-k+1;++lx){ int ly=lx+k-1,ll; int xm[31],ym[31],cm[31]; ll=ly; mul(cm,ys[m-k+1],a[lx]); ly=ll;//不记录一下ly会莫名的变成0,xm的值也是一样。??? add(xm,cm,f[lx+1][ly]); mul(ym,ys[m-k+1],a[ly]); add(ym,ym,f[lx][ly-1]); if(MAX(xm,ym)) memcpy(f[lx][ly],xm,sizeof(int)*31); else memcpy(f[lx][ly],ym,sizeof(int)*31); } add(ans,ans,f[1][m]); } printf("%d",ans[ans[0]]); for(int i=ans[0]-1;i>=1;--i) printf("%05d",ans[i]); printf("\n"); return 0; } ```
by 法克 @ 2017-10-01 11:47:09


```cpp #include<bits/stdc++.h> #define lll __int128 void print(lll x) { if (x==0) return; if (x) print(x/10); putchar(x%10+'0'); } int n,m; lll ans=0; int a[100]={0}; lll f[100][100]; lll p[100]={1}; lll dp() { memset(f,0,sizeof(f)); for(int i=1;i<=m;i++) { for(int j=m;j>=i;j--) { f[i][j]=std::max( f[i-1][j]+ p[m-j+i-1]*a[i-1] , f[i][j+1]+ p[m-j+i-1]*a[j+1] ); } } lll maxn=-1; for(int i=1;i<=m;i++) maxn=std::max(maxn,f[i][i]+a[i]*p[m]); return maxn; } int main() { for(int i=1;i<=90;i++) p[i]=p[i-1]<<1; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) scanf("%d",a+j); ans+=dp(); } if(ans==0) puts("0"); else print(ans); return 0; } ****可能是错的**** ```
by lty2017 @ 2017-10-11 23:03:27


#。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
by lty2017 @ 2017-10-11 23:05:34


、、、、、、、、、、、、、
by CTSC_Danile @ 2017-11-07 18:42:16


|