现在的位置: 首页 > 综合 > 正文

POJ 1976 A Mini Locomotive

2013年07月18日 ⁄ 综合 ⁄ 共 753字 ⁄ 字号 评论关闭

  继续简单的背包入门题,原谅我当时的无知。

 代码里面重要部分都有注释。

  

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define N 50100
int a[N];
int dp[4][N];
int b[N];
int main()
{
    int n;
    cin >> n;
    while(n--)
    {
     int m;
     cin >> m;
     int sum = 0;
     for(int i=1; i<=m; ++i)
       {cin >> a[i];
        sum += a[i];
       }
      int t;
     cin >> t;//t是其长度;
     int g = m-t+1;
     memset(b,0,sizeof(b));
     if(t*3 >= m)
     {
         cout << sum <<endl;
         continue;
     }
     for(int i=1; i<=t; ++i)
        for(int j=1; j<=g; ++j)
        b[j] += a[i+j-1];
     for(int i=0; i<=g; ++i)
        dp[0][i] = 0;//d[i][j]  i表示已经给几个车头装上了车厢, j表示第i个车头的装的是从j开始的车厢。
     for(int i=1; i<=3; ++i)
      for(int j=t*(i-1)+1; j<=g-(3-i)*t; ++j )
     {
       if(i == 1)
       dp[i][j] = b[j];
        else
        {//j = 5, j = 6;
         dp[i][j] = dp[i-1][j-t] + b[j];
         for(int k=(i-2)*t+1; k < j-t; ++k)
          if(dp[i-1][k] + b[j] > dp[i][j])
            dp[i][j] = dp[i-1][k] + b[j];
        }
     }
     int ma = 0;
     for(int j=t*2+1; j<=g; ++j)
        if(ma < dp[3][j])
            ma = dp[3][j];
     cout << ma<<endl;
    }
    return 0;
}

抱歉!评论已关闭.