蒟蒻的疑惑
查看原帖
蒟蒻的疑惑
1255092
xinqiji114514楼主2024/7/10 16:51
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=215;
int n;
LL dp1[N][N],dp2[N][N];
LL a[N],s[N];
LL ans1=0x3f3f3f3f,ans2;
int main()
{
  scanf("%d",&n);
  memset(dp1,0x3f,sizeof dp1);
  //memset(dp2,-0x3f,sizeof dp2);
  for(int i=1;i<=n;i++)
  {
    scanf("%lld",&a[i]);
    s[i]=s[i-1]+a[i];
    dp1[i][i]=0;
    dp2[i][i]=0;
  }
 for(int i=n+1;i<=2*n;i++)
 {
   a[i]=a[i-n];
   s[i]=s[i-1]+a[i];
   dp1[i][i]=0;
   dp2[i][i]=0;
 }
   
      for(int len=2;len<=n;len++)
      {
        for(int l=1;l+len-1<=n*2;l++)
        {
          int r=l+len-1;
          for(int k=l;k<=r;k++)
          {
            dp1[l][r]=min(dp1[l][r],dp1[l][k]+dp1[k+1][r]+s[r]-s[l-1]);
          }
        }
      }

      for(int len=2;len<=n;len++)
      {
        for(int l=1;l+len-1<=2*n;l++)
        {
          int r=l+len-1;
          for(int k=l;k<=r;k++)
          {
            dp2[l][r]=max(dp2[l][r],dp2[l][k]+dp2[k+1][r]+s[r]-s[l-1]);
          }
        }
      }

  for(int i=1;i<=n*2;i++)
  {
    ans1=min(ans1,dp1[i][i+n-1]);
    ans2=max(ans2,dp2[i][i+n-1]);
  }
  printf("%lld\n%lld",ans1,ans2);
}

为什么求最大值时,要比最大值dp数组初始化为负无穷,如果为零就会是正解的两倍,求大佬解惑

2024/7/10 16:51
加载中...