• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

  • 联系
  • 订阅
  • 管理

View Post

poj 1976 A Mini Locomotive 动规

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

       设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;
}

posted on 2011-02-25 22:19  sysuwhj  阅读(447)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3