4 条题解

  • 7
    @ 2024-3-30 12:56:33
    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int N=1e6+5;
    const ll INF=2e18;
    int n,m,x;
    int a[N];
    ll sum[N],tmp[N],f[N];
    int main(){
        cin>>n>>m;
        for (int i=1;i<=n;i++)cin>>a[i];
        for (int i=1;i<=n;i++){
            cin>>x;
            sum[i]=sum[i-1]+x;
        }//前缀和
        for (int i=1;i<=m;i++)tmp[i]=-INF;//初始化
        for (int i=1;i<=n;i++){
            f[i]=max(f[i-1],sum[i]+tmp[a[i]]);
            tmp[a[i]]=max(tmp[a[i]],f[i-1]-sum[i-1]);
        }//动归
        cout<<f[n];
        return 0;
    }
    

    点赞点赞😄

    • 3
      @ 2023-11-5 20:21:08
      提示

      f[i]表示前 i 张牌能够获得的最大分数,而当第 i 张牌和第 j 张牌的花色相同时,f[i]可以由 f[j - 1] 转移过来, 转移方程: f[i] = f[j - 1] + sum{v[j]~v[i]};

      若使用枚举求和,则时间复杂度为O(n³),本题的数据范围不大,O(n²)时间复杂度可以通过,因此可使用前缀和优化求解v[j] ~v[i]的区间和,把时间复杂度降低到O(n²)即可。

      • -5
        @ 2024-3-22 18:29:30
        #include<bits/stdc++.h>
        using namespace std;
        const int N=1e6+10;
        const long long INF=2e18;
        int n,m;
        int a[N];
        long long sum[N],tmp[N],f[N];
        int main()
        {
            cin>>n>>m;
            for(int i=1;i<=n;i++)
            {
                cin>>a[i];
            }
            for(int i=1;i<=n;i++)
            {
                int x;
                cin>>x;
                sum[i]=sum[i-1]+x;
            }
            for(int i=1;i<=m;i++)
            {
                tmp[i]=-INF;
            }
            for(int i=1;i<=n;i++)
            {
                f[i]=max(f[i-1],sum[i]+tmp[a[i]]);
                tmp[a[i]]=max(tmp[a[i]],f[i-1]-sum[i-1]);
            }
            cout<<f[n]<<endl;
            return 0;
        }
        
        • -7
          @ 2024-3-23 22:30:33

          #include<bits/stdc++.h>#HETAO845776 using namespace std; const int N=1e6+20; const long long INF=2e18; int n,m; int a[N]; long long sum[N],tmp[N],f[N]; int main() { cin>>n>>m; for(int i=1;i<=n;i++) { cin>>a[i]; } for(int i=1;i<=n;i++) { int x; cin>>x; sum[i]=sum[i-1]+x; } for(int i=1;i<=m;i++) { tmp[i]=-INF; } for(int i=1;i<=n;i++) { f[i]=max(f[i-1],sum[i]+tmp[a[i]]); tmp[a[i]]=max(tmp[a[i]],f[i-1]-sum[i-1]); } cout<<f[n]<<endl; return 0; }

          • 1

          信息

          ID
          549
          时间
          1000ms
          内存
          256MiB
          难度
          5
          标签
          (无)
          递交数
          235
          已通过
          94
          上传者