POJ1976 (完全背包)

这是一个关于算法实现的博客,主要讲解如何使用动态规划解决一个与火车车厢和火车头有关的数学问题。程序通过读取输入的车厢数量、每个车厢的乘客数量以及火车头的最大牵引车厢数,计算出在给定条件下能拉的最大旅客数量。程序中,作者定义了一个二维动态规划数组,并利用前缀和优化了计算过程。
摘要由CSDN通过智能技术生成

import java.io.*;

import java.util.*;

public class POJ1976 {

   static int dp[][] = new int[50000+5][4];//dp[i][j]:前i个车厢,用j个火车头拉,所能拉的最大人数

   static int sum[] = new int[ 50000 + 5];

   static int res;

public static void main(String[] args) throws Exception {

 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

 StringTokenizer st = new StringTokenizer(br.readLine());

 int T = Integer.parseInt(st.nextToken());

 for(int t = 1;t <= T;t++) {

  st = new StringTokenizer(br.readLine());

  Arrays.fill(sum, 0);

  res = 0;

  int N = Integer.parseInt(st.nextToken());

  for(int i = 1;i <= N ; i++) {

   Arrays.fill(dp[i], 0);

  }

  st = new StringTokenizer(br.readLine());

  for(int i = 1;i <= N;i++) {

   sum[i] = Integer.parseInt(st.nextToken());

   sum[i] += sum[i-1];//前缀和

  }

  st = new StringTokenizer(br.readLine());

  int M = Integer.parseInt(st.nextToken());

  int k = 0;

  for(int i = 1;i <= N;i++) {

   k= i - M < 0 ? 0 : i -M ;

//    System.out.println("k =="+ k);

   for(int j = 1;j < 4;j++) {

                dp[i][j]=Math.max(dp[i-1][j],dp[k][j-1]+sum[i]-sum[k]);

   }

  }

  System.out.println(dp[N][3]);

 }

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值