题目链接
题意:有n个气球,每个气球都有一个价值和一种颜色。现在有q个询问,每次询问给个a、b,让你从原气球中按顺序取出一些气球。对于一个气球若前面一个气球和它的颜色相同那么加上这个气球的值乘a,其他情况(第一个气球或者前一个气球和它颜色不同)加上这个气球的值乘以b,求这个值最大是多少。
思路:对于每种颜色的气球,它的价值要么*a,要么 *b,dp【i】记录每组颜色的最大价值。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
const ll inf=1e18;
ll a,b,dp[maxn],v[maxn];
int n,q,c[maxn];
int main()
{
scanf("%d %d",&n,&q);
for(int i=1;i<=n;++i) scanf("%lld",&v[i]);
for(int i=1;i<=n;++i) scanf("%d",&c[i]);
while(q--)
{
for(int i=0;i<=n;++i) dp[i]=-inf;
scanf("%lld %lld",&a,&b);
ll ans=0;
int id1=0,id2=0;
for(int i=1;i<=n;++i)
{
dp[c[i]]=max(dp[c[i]],max(dp[c[i]]+v[i]*a,v[i]*b));
dp[c[i]]=max(dp[c[i]],((id1==c[i])?dp[id2]:dp[id1])+v[i]*b);
if(id1!=c[i])
{
if(dp[c[i]]>dp[id1]) id2=id1,id1=c[i];
else if(dp[c[i]]>dp[id2]) id2=c[i];
}
ans=max(ans,dp[c[i]]);
}
printf("%lld\n",ans);
}
}