Wannafly挑战赛21 C:大水题

思路很简单
直接上代码:

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int maxn=300000+100;

ll ans[maxn],val[maxn],sum[maxn],dp[maxn];
map<int,ll>M; 

int main(){

    int n;
    scanf("%d",&n);
    sum[0]=dp[0]=0;
    for(int i=1;i<=n;i++) scanf("%lld",&ans[i]);
    for(int i=1;i<=n;i++) scanf("%lld",&val[i]),sum[i]=sum[i-1]+val[i];
    for(int i=1;i<=n;i++){

        dp[i]=dp[i-1];
        if(M.count(ans[i])) dp[i]=max(dp[i],M[ans[i]]+sum[i]),M[ans[i]]=max(M[ans[i]],dp[i-1]-sum[i-1]);
        else M[ans[i]]=dp[i-1]-sum[i-1];

    }
    printf("%lld\n",dp[n]);
}

猜你喜欢

转载自blog.csdn.net/qq_37960603/article/details/81407762