首页 > 代码库 > POJ 1976 A Mini Locomotive

POJ 1976 A Mini Locomotive

$dp$。

要求选择$3$个区间,使得区间和最大。$dp[i][j]$表示前$i$个数中选择了$j$段获得的最大收益。

#include <cstdio>#include <cmath>#include <set>#include <cstring>#include <algorithm>using namespace std;int T,n,k;int dp[50010][5];int a[50010];int main(){    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        memset(dp,0,sizeof dp);        for(int i=1;i<=n;i++) scanf("%d",&a[i]);        for(int i=1;i<=n;i++) a[i]=a[i]+a[i-1];        scanf("%d",&k);        for(int i=1;i<=n;i++)        {            for(int j=1;j<=3;j++)            {                if(i-k>=0) dp[i][j] = max(dp[i-1][j] , dp[i-k][j-1]+a[i]-a[i-k]);            }        }        printf("%d\n",dp[n][3]);    }    return 0;}

 

POJ 1976 A Mini Locomotive