HDU 1244 Max Sum Plus Plus Plus

题意:

给定一个由n个正整数组成的整数序列
a1 a2 a3 ... an
求按先后次序在其中取m段长度分别为l1、l2、l3...lm的不交叠的连续整数的和的最大值。
分析:
dp[i][j]表示前i个数中选j段所能构成的最大值
dp[i][j]=max(dp[i-1][j], dp[i-len[j]][j-1]+sum) len[j]表示第j段的长度,sum表示长度为len[j]的连续序列的和。
//dp[i][j]表示前i个数中选j段所能构成的最大值
//dp[i][j]=max(dp[i-1][j], dp[i-len[j]][j-1]+sum) len[j]表示第j段的长度,sum表示长度为len[j]的
//连续序列的和。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int sum[1001];
int len[20];
int a[1001];
int dp[1001][22];
int main()
{
    int n, m, i, j, k;
    while (scanf("%d",&n),n)
    {
        scanf("%d",&m);
        for (i=1; i<=m; i++)
            scanf("%d",&len[i]);
        for (i=1; i<=n; i++)
            scanf("%d",&a[i]);
        sum[0] = 0;
        sum[1] = a[1];
        for (i=2; i<=n; i++)
            sum[i] = sum[i-1]+ a[i];
        memset(dp,0,sizeof(dp));
        for (i=1; i<=n; i++)
        {
            for (j=1; j<=m && j<=i; j++)
            {
               dp[i][j] = max(dp[i][j],dp[i-1][j]);
               if (i >=len[j])
                   dp[i][j] = max(dp[i][j],dp[i-len[j]][j-1]+sum[i]-sum[i-len[j]]);
             }
        }
        printf("%d\n",dp[n][m]);
    }
    return 0;
}

 

posted @ 2013-01-30 22:37  'wind  阅读(417)  评论(0编辑  收藏  举报