题目大意
一个人可以往前跳,跳的距离可以是无限的,但必须最后跳到第n个点并不超过第n个点
如果他从 i i i 跳到 j j j,那么他得到的 a [ j ] ∗ ( j − i ) a[j]*(j-i) a[j]∗(j−i)的分数,其中 a [ j ] a[j] a[j]是 j j j点上的分数 ( j > i ) (j>i) (j>i)
原点没有分数,求他跳到第 n n n个点最多能得到多少分
题目解析
这题有多种做法,这里给出贪心的做法
设 p o s pos pos为 n n n, w = a [ p o s ] . n u m w=a[pos].num w=a[pos].num
从后往前找,遇到第一个比 w w w大的数,就 a n s + = w ∗ ( p o s − i ) ; ans+=w*(pos-i); ans+=w∗(pos−i);,并将 p o s pos pos赋为 i i i, w = a [ p o s ] . n u m w=a[pos].num w=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;
}