蓝桥杯 算法提高 第二点五个不高兴的小明(动态规划) JAVA
问题描述
有一条长为n的走廊,小明站在走廊的一端,每次可以跳过不超过p格,每格都有一个权值wi。
小明要从一端跳到另一端,不能回跳,正好跳t次,请问他跳过的方格的权值和最大是多少?
小明要从一端跳到另一端,不能回跳,正好跳t次,请问他跳过的方格的权值和最大是多少?
输入格式
输入的第一行包含两个整数n, p, t,表示走廊的长度,小明每次跳跃的最长距离和小明跳的次数。
接下来n个整数,表示走廊每个位置的权值。
接下来n个整数,表示走廊每个位置的权值。
输出格式
输出一个整数。表示小明跳过的方格的权值和的最大值。
样例输入
8 5 3
3 4 -1 -100 1 8 7 6
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); } }