题:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1529
解:http://acm.nefu.edu.cn/JudgeOnline/forumDiscuss.php?problem_id=1529
通过题意不难得出想到DP,也就不难推出转移方程。
f[i]=f[i−1];
f[i]=max(f[i],f[j−1]+sum[i]−sum[j−1])(c[i]==c[j]);
再进一步推导一下:
然后把sum[i]sum[i]拿出来,发现对于同c[i]c[i]需要f[i−1]−sum[j−1]f[i−1]−sum[j−1]最大,所以对于每一种花色开个数组记一下就可以了。
效率O(n)
-----------------------------------------下面代码来自互联网-----------------------------
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn=1000000,maxk=1000000;
int n,K,col[maxk+5];
LL sum[maxn+5],f[maxn+5],MAX[maxk+5];
int main()
{
int x;
cin>>n>>K;
for (int i=1;i<=n;i++) cin>>col[i];
for (int i=1;i<=n;i++) {cin>>x;sum[i]=sum[i-1]+x;}
memset(MAX,192,sizeof(MAX));
for (int i=1;i<=n;i++)
{
f[i]=max(f[i-1],MAX[col[i]]+sum[i]);
MAX[col[i]]=max(MAX[col[i]],f[i-1]-sum[i-1]);
}
return printf("%lld\n",f[n]),0;
}