2 条题解

  • 0
    @ 2025-10-8 16:58:25
    #include <bits/stdc++.h>//内存:73 M    时间:36 ms 
    using namespace std;
    typedef long long ll;
    int n;
    ll a[3010], f[3010][3010];
    
    int main()
    {
        scanf("%d", &n);
        ll sum=0;for (int i = 1; i <= n; i++) scanf("%lld", &a[i]), sum += a[i];
        memset(f, 0, sizeof(f));
        for (int i = 1; i <= n; i++) f[i][i] = a[i];
        for (int i = 1; i <= n; i++) a[i] += a[i - 1];
        for (int len = 2; len <= n; len++)
            for (int i = 1; i + len - 1 <= n; i++)
            {
                int j=i + len - 1;
                f[i][j] = a[j]-a[i-1] - min(f[i][j-1],f[i+1][j]);
            }
                
        printf("%lld\n", 2*f[1][n]-sum);
        return 0;
    }
    
    #include <bits/stdc++.h>//内存:37 M     时间:25 ms
    using namespace std;
    typedef long long ll;
    int n;
    ll a[3010], f[3010*3010/2];
    int getid(int i,int j)
    {
        int st=n,ed=n-(i-1)+1;
        return (ed+st)*(st-ed+1)/2+(j-i+1);
    }   
    int main()
    {
        scanf("%d", &n);
        ll sum=0;for (int i = 1; i <= n; i++) scanf("%lld", &a[i]), sum += a[i];
        memset(f, 0, sizeof(f));
        for (int i = 1; i <= n; i++) f[getid(i,i)] = a[i];
        for (int i = 1; i <= n; i++) a[i] += a[i - 1];
        for (int len = 2; len <= n; len++)
            for (int i = 1; i + len - 1 <= n; i++)
            {
                int j=i + len - 1;
                f[getid(i,j)] = a[j]-a[i-1] - min(f[getid(i+1,j)], f[getid(i,j-1)]);
            }
                
        printf("%lld\n", 2*f[getid(1,n)]-sum); return 0;
    }
    
    • 0
      @ 2025-10-8 16:58:04
      #include <bits/stdc++.h>//内存:73 M	时间:36 ms 
      using namespace std;
      typedef long long ll;
      int n;
      ll a[3010], f[3010][3010];
      
      int main()
      {
          scanf("%d", &n);
          ll sum=0;for (int i = 1; i <= n; i++) scanf("%lld", &a[i]), sum += a[i];
      	memset(f, 0, sizeof(f));
          for (int i = 1; i <= n; i++) f[i][i] = a[i];
          for (int i = 1; i <= n; i++) a[i] += a[i - 1];
          for (int len = 2; len <= n; len++)
              for (int i = 1; i + len - 1 <= n; i++)
              {
                  int j=i + len - 1;
                  f[i][j] = a[j]-a[i-1] - min(f[i][j-1],f[i+1][j]);
              }
                  
          printf("%lld\n", 2*f[1][n]-sum);
          return 0;
      }
      
      #include <bits/stdc++.h>//内存:37 M     时间:25 ms
      using namespace std;
      typedef long long ll;
      int n;
      ll a[3010], f[3010*3010/2];
      int getid(int i,int j)
      {
          int st=n,ed=n-(i-1)+1;
          return (ed+st)*(st-ed+1)/2+(j-i+1);
      }   
      int main()
      {
          scanf("%d", &n);
          ll sum=0;for (int i = 1; i <= n; i++) scanf("%lld", &a[i]), sum += a[i];
      	memset(f, 0, sizeof(f));
          for (int i = 1; i <= n; i++) f[getid(i,i)] = a[i];
          for (int i = 1; i <= n; i++) a[i] += a[i - 1];
          for (int len = 2; len <= n; len++)
              for (int i = 1; i + len - 1 <= n; i++)
              {
                  int j=i + len - 1;
                  f[getid(i,j)] = a[j]-a[i-1] - min(f[getid(i+1,j)], f[getid(i,j-1)]);
              }
                  
          printf("%lld\n", 2*f[getid(1,n)]-sum);
          return 0;
      }
      • 1

      信息

      ID
      1681
      时间
      2000ms
      内存
      1024MiB
      难度
      6
      标签
      递交数
      67
      已通过
      21
      上传者