这题有些像求连续子序列和的最大值

       设dp[i][j]表示i个火车头拉动j个火车舱的人数和的最大值,状态方程如下:dp[i][j] = max(dp[i-1][j-times]+num[j]+..+num[j-times+1], dp[i][k])

 

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int MAX = 50005;

int dp[5][MAX];
int num[MAX];
int n;

int main()
{
	int cases;

	scanf("%d", &cases);
	int times;

	while (cases--)
	{
		scanf("%d", &n);
		for (int i = 1; i <= n; i++)
			scanf("%d", &num[i]);

		scanf("%d", &times);
		memset(dp, 0, sizeof(dp));

		for (int i = 1; i <= 3; i++)
			for (int v = times; v <= n; v++)
			{
				int sum = 0;
				for (int j = 0; j < times; j++)
					sum += num[v-j];
				dp[i][v] = dp[i-1][v-times] + sum;
				for (int k = i*times; k < v; k++)
					dp[i][v] = max(dp[i][v], dp[i][k]);
			}

		printf("%d\n", dp[3][n]);
	}
	return 0;
}

相关文章:

  • 2022-12-23
  • 2022-01-09
  • 2021-12-30
  • 2022-02-15
  • 2021-06-12
  • 2021-11-16
  • 2022-01-05
  • 2021-06-21
猜你喜欢
  • 2022-12-23
  • 2021-12-16
  • 2022-01-30
  • 2021-10-30
  • 2021-08-23
  • 2021-05-21
  • 2021-04-03
相关资源
相似解决方案