抢金块(gold) 基础dp

本文介绍了一种基于动态规划的游戏算法——抢金块。玩家在限定的步数内跳跃以收集金块,目标是获得最大价值。通过状态转移方程实现了最优路径的选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

抢金块(gold)
【问题描述】
地面上有一些格子,每个格子上面都有金块,但不同格子上的金块有不同的价值,你一次可以跳S至T步(2≤S<T≤10)。例如S=2,T=4,你就可以跳2步、3步或4步。你从第一个格子起跳,必须跳到最后一个格子上,请你输出最多可以获得的金块的总价值。
【输入格式】
第一行是格子个数n(n<1000);第二行是S和T,保证T大于S(2≤S<T≤10);
第三行是每个格子上的金块价值Pi(Pi<10000)。
【输出格式】
输出最多可以获得的金块的总价值。
【输入样例】
10
2 3
4 5 8 2 8 3 6 7 2 9
【输出样例】
36
样例说明:跳1、3、5、8、10,总价值:4+8+8+7+9=36

思路:每次能踏2.3.4….n步,所以可以很快想到状态
dp[i] 代表到i块获得的最大总价值
于是就能得到状态转移方程:
dp[i] = max(dp[i-2],dp[i-3],…,dp[i-n])+v[i];

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
using namespace std;

int main(){
    int n,S,T,v[1001],dp[1001]={0};
    scanf("%d%d%d",&n,&S,&T);

    for(int i = 1;i<=n;i++){
        scanf("%d",&v[i]);
    }
    dp[1] = v[1];
    for(int i = 2;i<=n;i++){
        for(int j = S;j<=T;j++){
            if(i-j>0){
                dp[i] = max(dp[i],dp[i-j]+v[i]);
            }
        }
    }
    printf("%d",dp[n]);
    return 0;
} 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值