PKU--1976 A Mini Locomotive (01背包)

题目http://poj.org/problem?id=1976
分析:给n个数,求连续3段和的最大值。
这个题目的思考方式很像背包问题。
dp[i][j]表示前i个数字,放在j段的最大值。
如果选了第i个数,则有 dp[i-1][j]  如果不选第i个数,由于题目是要连续的,
则有dp[i-m][j-1]+sum[i]-sum[i-m] ,这里i-m是要保证连续。

dp[i][j]=max{ dp[i-1][j] ,dp[i-m][j-1]+sum[i]-sum[i-m]  }

#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

int T,n,m,sum[50010],num[50010],dp[50010][5];

int main()
{
  scanf("%d",&T);
  while (T--)
  {
    scanf("%d",&n);

    memset(sum,0,sizeof(sum));
    memset(dp,0,sizeof(dp));

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

    for(int i=m;i<=n;i++)
      for(int j=1;j<=3;j++)
        dp[i][j]=max(dp[i-1][j],dp[i-m][j-1]+sum[i]-sum[i-m]);

    printf("%d ",dp[n][3]);

  }

  return 0;
}






原文地址:https://www.cnblogs.com/gt123/p/3468470.html