蓝桥杯 算法提高 第二点五个不高兴的小明(动态规划) JAVA

问题描述
有一条长为n的走廊,小明站在走廊的一端,每次可以跳过不超过p格,每格都有一个权值wi。
小明要从一端跳到另一端,不能回跳,正好跳t次,请问他跳过的方格的权值和最大是多少?
输入格式
输入的第一行包含两个整数n, p, t,表示走廊的长度,小明每次跳跃的最长距离和小明跳的次数。
接下来n个整数,表示走廊每个位置的权值。
输出格式
输出一个整数。表示小明跳过的方格的权值和的最大值。
样例输入
8 5 3
3 4 -1 -100 1 8 7 6
样例输出
12
数据规模和约定
1<=n, p, t<=1000, -1000<=wi<=1000。
思路
本题动态规划,二维数组dp[i][j]用于存储第i次跳跃,跳到j位置上权重值和的最大值。
 
import java.util.*;
public class 第二点五个不高兴的小明 {
    static int n,p,t;
    static int[] fangge;
    static int[][] dp; //dp[i][j]=k 表示第i步走到第j个位置有权重值和为K
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scan=new Scanner(System.in);
        n=scan.nextInt();
        p=scan.nextInt();
        t=scan.nextInt();
        fangge=new int[n+2];
        dp=new int[t+2][n+2];
        for(int i=1;i<=n;i++) {
            fangge[i]=scan.nextInt();
        }
        for(int i=1;i<=t;i++) {
            for(int j=0;j<=n;j++) {
                dp[i][j]=Integer.MIN_VALUE;
            }
        }
        for(int i=1;i<=p && i<=n;i++) {
            dp[1][i]=fangge[i];
        }
        dp[0][0]=0;
        int step=2;
        while(step<t) {
            for(int index=step-1;index<=n;index++) {
                if(dp[step-1][index]==Integer.MIN_VALUE) continue;
                for(int i=1;i<=p;i++) {
                    int newIndex=index+i;
                    if(newIndex>n+1) continue;
                    int temp=dp[step-1][index]+fangge[newIndex];
                    dp[step][newIndex]=Math.max(dp[step][newIndex], temp);
                }
            }
            step++;
        }
        int maxN=Integer.MIN_VALUE;
        for(int i=1;i<=n;i++) {
            if(dp[t-1][i]>maxN && i+p>=n+1) {
                maxN=dp[t-1][i];
            }
        }
        System.out.println(maxN);
    }

}

 

posted @ 2021-04-15 12:11  歪你的糖掉了  阅读(201)  评论(0)    收藏  举报