题解:P10381 「HOI R1」杂赛选比
xiaoliebao1115 · · 题解
官方线段树太难打了,所以我用堆来优化。
动态规划
定义
更新
所以在所有
时间复杂度
优化
以
在更新时,每次取出头
时间复杂度
code
这里给出关键部分。
for(int i=2;i<=n;i++)
{
while(1)
{
if(q.top().second>=i||q.empty()) break;
q.pop();
}
if(q.empty()) continue;
/*
for(int j=1;j<i;j++)
{
if(a[j]+j>=i)
{
dp[i]=max(dp[i],dp[j]+sum[i-1]-sum[j]);
}
}*/
dp[i]=q.top().first-(sum[n]-sum[i-1]);
q.push({dp[i]+sum[n]-sum[i],i+a[i]});
}
最后的答案就是所有数中最大的