列表

详情


NC54391. 跳格子

描述

        Reverie最近迷上了跳格子的游戏,地面上有个格子排成一排,编号为1到n,Reverie从第一个格子开始,必须跳到最后一个格子上,她每次可以跳s到t个格子。每个格子都有一个权值,跳到这个格子上即可获得这个权值(包括第一个和最后一个格子)。
        Reverie想知道,她能获得的权值最大是多少。

输入描述

第一行一个正整数,表示测试数据的组数。
每组数据第一行三个正整数n, s, t, 表示格子的数量和Reverie每次跳格子数量的下限和上限。
之后一行n个正整数,表示每个格子的权值。

输出描述

对于每组数据,一行内输出一个正整数,表示Reverie能获得的最大权值。
如果Reverie没办法跳到最后一个格子,输出-1.

示例1

输入:

2
6 2 3
1 2 3 4 5 6
5 3 3
1 2 3 4 5

输出:

11
-1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 34ms, 内存消耗: 376K, 提交时间: 2020-01-16 20:48:57

# include <iostream>
# include <algorithm>
# include <cstring>

const int MAXN = 1e3 + 5;
const int NINF = 0xc0c0c0c0;
int v[MAXN];
int dp[MAXN];
int n;
int s;
int t;

int fmax(int num) {
	int max = NINF;
	for (int i=num-t; i<=num-s; i++) {
		if (i>=1 && dp[i] > max) {
			max = dp[i];
		}
	}
	
	return max;
}

int main() {
	int T;
	std::cin >> T;
	while (T--) {
		memset(dp, 0xc0, sizeof(dp));
		std::cin >> n >> s >> t;
		for (int i=1; i<=n; i++) {
			std::cin >> v[i];
		}
		
		dp[1] = v[1];
		for (int i=2; i<=n; i++) {
			if (fmax(i) == NINF) {
				dp[i] = NINF;
			} else {
				dp[i] = fmax(i) + v[i];
			}
		}
		
		if (dp[n] != NINF) {
			std::cout << dp[n] << "\n";
		} else {
			std::cout << "-1\n";
		}
	}
	
	return 0;
}

C++ 解法, 执行用时: 20ms, 内存消耗: 432K, 提交时间: 2021-05-25 09:00:26

#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
int v[N],dp[N],s,t;
int main()
{
	int T,n,s,t;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d%d",&n,&s,&t);
		for(int i=1;i<=n;++i)
			scanf("%d",&v[i]);
		memset(dp,-1,sizeof(int)*(n+1));
		dp[1] = v[1];
		for(int i=2;i<=n;++i)
		{
			for(int j=s;j<=t;++j)
			{
				if(i<=j||dp[i-j]==-1) continue;
				dp[i] = max(dp[i],dp[i-j]+v[i]);
			}
		}
		printf("%d\n",dp[n]);
	} 
	
	return 0;
} 

Python3 解法, 执行用时: 277ms, 内存消耗: 7116K, 提交时间: 2021-10-19 20:58:41

T=int(input())
for i in range(T):
    n,s,t=map(int,input().split())
    lb=list(map(int,input().split()))
    dp=[-1 for i in lb]
    dp[0]=lb[0]
    for i in range(n):
        for j in range(s,t+1):
            if i<j or dp[i-j]==-1:
                continue
            dp[i]=max(dp[i],lb[i]+dp[i-j])
    print(dp[-1])

上一题