poj1976 二维0 1 bag

题意:三个wide宽的区间可以装最大的数字组合

思路就是把所有的叠加起来为一个sum数组,不会超出int型,方便做处理

然后对于转移方程   dp[i][j]=max(dp[i-1][j],dp[i-wide][j-1]+sum[i]-sum[i-wide])  的理解:

就是dp[ i ][ j ] 中 i 表示前面 i 个列车的教练可以教的人数,j  表示三个车厢用了多少个车厢了

就是前面所有区间装的数,和  上一个区间以及之前的区间加上这个区间的装的人数   哪一个大取哪一种方案


#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;


int sum[50010];
int dp[50010][5];


int main()
{
    int T,wide,n;
    scanf("%d",&T);
    while(T--&&scanf("%d",&n))
    {
        sum[0]=0;
        int temp;
        for(int i=1;i<=n;i++){
            scanf("%d",&temp);
            sum[i]=sum[i-1]+temp;
        }
        scanf("%d",&wide);

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

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

    }
    return 0;
}


你可能感兴趣的:(poj1976 二维0 1 bag)