求助90分
查看原帖
求助90分
428449
Amon_Xolotl楼主2023/9/13 19:34
#include<bits/stdc++.h>
using namespace std;
const int N=81,mod=10000;
int n,m;
struct node
{
  int s[22],len;
  node(){
  memset(s,0,sizeof(s));
  len=0;
  }
  void print(){
    printf("%d",s[len]);
    for(int i=len-1;i>0;--i)
    {
      if(s[i]==0)
      {
				printf("0000"); 
				continue;
			}
      for(int k=10;k*s[i]<mod;k*=10) 
      {
        printf("0");
      }
      printf("%d", s[i]);
    }
  }
}dp[N][N][N][2],f[N],ans,qp[N];
int a[N][N];
node operator + (const node &x,const node &y)
{
  node z;
  z.len=max(x.len,y.len);
  int t=0;
  for(int i=1;i<=z.len;++i)
  {
    z.s[i]=x.s[i]+y.s[i]+t;
    t=z.s[i]/mod;
    z.s[i]%=mod;
  }
  if(t>0)
  {
    z.s[++z.len]=t;
  }
  return z;
}
node operator * (const node &x,const int &y)
{
	node z;
  z.len=x.len; 
  int t = 0;
	for (int i=1;i<=z.len;i++) {
		z.s[i]=x.s[i]*y+t;
		t=z.s[i]/mod;
		z.s[i]%=mod;
	}
	while(t>0)
	{
	  z.s[++z.len]=t%mod,t/=mod;
  }
		
	return z;
}
node Max(const node &x,const node &y)
{
  if(x.len>y.len)
  {
    return x;
  }
  else if(x.len<y.len)
  {
    return y;
  }
  for(int i=x.len;i>=1;--i)
  {
    if(x.s[i]>y.s[i])
    {
      return x;
    }
    else if(x.s[i]<y.s[i])
    {
      return y;
    }
  }
  return x;
}
void init()
{
  qp[0].s[1]=1,qp[0].len=1;
  for(int i=1;i<=m+2;++i)
  {
    qp[i]=qp[i-1] * 2;
  }
}
int main()
{
  scanf("%d%d",&n,&m);
  init();
  for(int i=1;i<=n;++i)
  {
    for(int j=1;j<=m;++j)
    {
      scanf("%d",&a[i][j]);
    }
  }
  for(int j=1;j<=m;++j)
  {
    for(int i=1;i<=n;++i)
    {
      for(int k=1;k<=j;++k)
      {
        if(k==j)
        {
          dp[j][i][k][0]=dp[j-1][i][k-1][0] + qp[j] * a[i][k];
          dp[j][i][k][1]=dp[j-1][i][k-1][1] + qp[j] * a[i][m-k+1]; 
        }
        else
        {
          dp[j][i][k][0]=Max(dp[j-1][i][k-1][0],dp[j-1][i][j-k][1]) + qp[j] * a[i][k];
          dp[j][i][k][1]=Max(dp[j-1][i][k-1][1],dp[j-1][i][j-k][0]) + qp[j] * a[i][m-k+1];
        }      
        if(j==m)
        {
          f[i]=Max(f[i],dp[j][i][k][0]);
        //  f[i].print();
        //  node mm=qp[j]*a[i][k];
        //  qp[j].print();
        }
      } 
    }
  }
  for(int i=1;i<=n;++i)
  {
    ans=ans + f[i];
  }
  ans.print();
  return 0;
}

为什么最后一个点老是输出167173209630412554668705068411(答案是167173209388627390745779233470)

2023/9/13 19:34
加载中...