思路:这个题是在一个n2的复杂度之上进行了dp方程的优化变形,最后变成线性dp,但还是有一些不懂(菜是本质,%oi爷们)
代码:
#include <bits/stdc++.h> using namespace std; const int maxn=1e6+5; typedef long long LL; int n,k; int col[maxn]; LL dp[maxn],sum[maxn],val[maxn]; bool Eoln(char ch) {return ch==10||ch==13||ch==EOF;} char readc() { static char buf[100000],*l=buf,*r=buf; if (l==r) r=(l=buf)+fread(buf,1,100000,stdin); if (l==r) return EOF; else return *l++; } int readi(int &x) { int tot=0,f=1;char ch=readc(),lst=‘+‘; while (‘9‘<ch||ch<‘0‘) {if (ch==EOF) return EOF;lst=ch;ch=readc();} if (lst==‘-‘) f=-f; while (‘0‘<=ch&&ch<=‘9‘) tot=tot*10+ch-48,ch=readc(); x=tot*f; return Eoln(ch); } int main() { readi(n),readi(k); for(int i=1;i<=n;i++) readi(col[i]); int a; for(int i=1;i<=n;i++) readi(a),sum[i]=sum[i-1]+a; memset(val,-0x3f,sizeof(val)); for(int i=1;i<=n;i++){ dp[i]=dp[i-1]; dp[i]=max(dp[i],val[col[i]]+sum[i]); val[col[i]]=max(val[col[i]],dp[i-1]-sum[i-1]); } printf("%lld\n",dp[n]); return 0; }