1509: 【入门】跳格子

内存限制:16 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:16 解决:7

题目描述

地面上有一排长度为n的格子1-n,每个格子上都有一个数xi,开始时你在位置0,每次你可以向前跳1-2格,然后取走格子上的数,直到跳到位置n+1。取走的数的和就是你的得分,现在你想知道你可能的最大得分是多少。

输入

一行四个整数n,A,B,C(n≤100000,0≤A,B,C≤10000),其中n表示格子的数量。x[i]由如下方式生成:
    for (int i = 1; i <= n; i++){
    int tmp = ((long long)A * i * i + B * i + C) % 20000;
    x[i] = tmp - 10000;
    }

输出

一行一个整数ans表示可能的最大得分。

样例输入 复制

3 1 1 1

样例输出 复制

-9993

提示

#include<bits/stdc++.h>
using namespace std;
int a[100100],dp[100100],n,i,ans;
int main(){
	int A,B,C;
    cin>>n>>A>>B>>C;
	for (i = 1;i <=n ;i++) {
        int tmp = ((long long)A * i * i + B * i + C) % 20000;
        a[i] = tmp - 10000;
	}
	dp[1]=a[1];
	dp[2]=max(a[2],a[1]+a[2]);
	for (i = 3;i <= n;i++) {
		dp[i]=max(dp[i-1],dp[i-2])+a[i];
	}
	ans=max(dp[n],dp[n-1]);
	cout<<ans; 
	return 0;
}