抢金块(gold) 基础dp

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a568283992/article/details/62422275

抢金块(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;
} 
展开阅读全文

没有更多推荐了,返回首页