题目大意
一个人可以往前跳,跳的距离可以是无限的,但必须最后跳到第n个点并不超过第n个点
如果他从 iii 跳到 jjj,那么他得到的a[j]∗(j−i)a[j]*(j-i)a[j]∗(j−i)的分数,其中a[j]a[j]a[j]是jjj点上的分数(j>i)(j>i)(j>i)
原点没有分数,求他跳到第nnn个点最多能得到多少分
题目解析
这题有多种做法,这里给出贪心的做法
设pospospos为nnn,w=a[pos].numw=a[pos].numw=a[pos].num
从后往前找,遇到第一个比www大的数,就ans+=w∗(pos−i);ans+=w*(pos-i);ans+=w∗(pos−i);,并将pospospos赋为iii,w=a[pos].numw=a[pos].numw=a[pos].num
实际上可以用DP加上斜率优化
代码
#include<bits/stdc++.h>
#define L long long
using namespace std;
int n,pos,ans,w;
struct A
{
int num,id;
}a[100005];
ifstream fin("game.in");
ofstream fout("game.out");
int main()
{
fin>>n;
for(int i=1;i<=n;i++)
fin>>a[i].num,a[i].id=i;
a[0].num=2e9;
for(int i=n;i>=0;i--)
if(a[i].num>w)
{
ans+=w*(pos-a[i].id);
w=a[i].num;
pos=i;
}
fout<<ans;
}