这两段区间DP书写方式有什么区别啊?

for(int i=n*2-1;i>=1;i--)
    {
        for(int j=i+1;j<2*n&&j-i<n;j++)
        {
            for(int k=i;k<=j-1;k++)
            {
                f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]+a[i]*a[k+1]*a[j+1]);
            }
            s=max(s,f[i][j]);
        }
    }
 for(int len=2;len<=n;len++)
    {
        for(int i=1;i<=2*n-1-len;i++)
        {
            int j=len+i-1;
            for(int k=i;k<=j-1;k++)
            {
                f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]+a[i]*a[k+1]*a[j+1]);
            }
            s=max(s,f[i][j]);
        }
    }

1 条评论

  • @ 2024-07-23 11:07:50
    
    #include <queue>
    #include <cmath>
    #include <cctype>
    #include <vector>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <iomanip>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int a[201];
    int f[201][201];
    int main()
    {
        int n,s=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            a[n+i]=a[i];
        }
        for(int i=n*2-1;i>=1;i--)
        {
            for(int j=i+1;j<2*n&&j-i<n;j++)
            {
                for(int k=i;k<=j-1;k++)
                {
                    f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]+a[i]*a[k+1]*a[j+1]);
                }
                s=max(s,f[i][j]);
            }
        }
        printf("%d",s);
        return 0;
    }
    
    
    

    还有他这篇题解中的f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]+a[i]*a[k+1]*a[j+1]);
    要怎么理解呢?

  • 1

信息

ID
1312
难度
4
分类
动态规划 | 环形DP 点击显示
标签
递交数
6967
已通过
2798
通过率
40%
被复制
14
上传者