思路:这个题是在一个n2的复杂度之上进行了dp方程的优化变形,最后变成线性dp,但还是有一些不懂(菜是本质,%oi爷们)
代码:
#includeusing 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' <'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;}