hihocoder-1274 自行车架(高维dp)

Posted LittlePointer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hihocoder-1274 自行车架(高维dp)相关的知识,希望对你有一定的参考价值。

时间限制:5000ms
单点时限:1000ms
内存限制:256MB

描述

小Hi的宿舍楼下有一块用于停自行车的区域。平时自行车都停得非常杂乱,于是楼长打算去买一排自行车架用来停车。自行车架一般有P个槽,每个槽的两侧都可以停入自行车;但是一个槽位同时只能有一侧停入自行车。此外,停入一辆自行车会导致无法在这一侧的附近若干个槽位中停入自行车。

经过调查,这栋宿舍楼的学生共拥有N辆A型自行车、M辆B型自行车和K辆C型自行车。其中A型自行车会导致这一侧的左右各1个槽位不能使用,B型自行车会导致这一侧的左右2个槽位不能使用,C型自行车会导致这一侧的左右3个槽位不能使用。

现给定N、M和K,楼长希望知道P至少要是多少,才能将所有自行车都停入。

技术分享

如图中所示,P最少为7就可以存放下2辆A型,1辆B型和2辆C型。

输入

每个输入文件包含多组测试数据,在每个输入文件的第一行为一个整数Q,表示测试数据的组数。

每组测试数据为3个整数N、M和K,意义如前文所述。

对于20%的数据,满足0<=N、M、K<=2,Q=100

对于40%的数据,满足0<=N、M、K<=50,Q=100

对于100%的数据,满足0<=N、M、K<=50,1<=Q<=100000

输出

对于每组测试数据,输出一个整数P,表示自行车架至少需要的槽位。

样例输入
4
2 1 2
1 0 0
2 0 2
1 2 2
样例输出
7
1
5
7
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int inf=1e8+1;
int dp[52][52][52][4][4][4],ans;
int get_dp()
{
    memset(dp,inf,sizeof(dp));
    dp[1][0][0][0][0][3]=1;
    dp[0][1][0][1][0][3]=1;
    dp[0][0][1][2][0][3]=1;
    for(int i=0;i<=50;i++)
    {
        for(int j=0;j<=50;j++)
        {
            for(int k=0;k<=50;k++)
            {
               for(int li=0;li<3;li++)
               {
                   for(int lj=0;lj<3;lj++)
                   {
                       for(int lk=1;lk<=3;lk++)
                       {
                          if(dp[i][j][k][li][lj][lk]!=inf)//i个A,j个B,k个C,li为长的那一列的最上面的类型,lj为短的,lk为长的与短的相距多少,
                          {
                            for(int ad=0;ad<3;ad++)
                            {
                                int fi=i,fj=j,fk=k;
                                if(ad==0)fi++;
                                if(ad==1)fj++;
                                if(ad==2)fk++;
                               int flk=lk+max(li,ad)+2;
                               if(flk>3)flk=3;
                               dp[fi][fj][fk][ad][lj][flk]=min(dp[fi][fj][fk][ad][lj][flk],dp[i][j][k][li][lj][lk]+max(li,ad)+2);
                               flk=max(max(lj,ad)+2-lk,1);
                               if(flk>3)flk=3;
                               dp[fi][fj][fk][ad][li][flk]=min(dp[fi][fj][fk][ad][li][flk],dp[i][j][k][li][lj][lk]+flk);
                            }

                          }
                       }
                   }
               }
            }
        }
    }
}
int main()
{
    int t,n,m,l;
    scanf("%d",&t);
    get_dp();
    dp[0][0][0][0][0][1]=0;
    while(t--)
    {
        scanf("%d%d%d",&n,&m,&l);
        ans=inf;
        for(int i=0;i<3;i++)
        {
            for(int j=0;j<3;j++)
            {
                for(int k=1;k<=3;k++)
                {
                    ans=min(ans,dp[n][m][l][i][j][k]);
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

以上是关于hihocoder-1274 自行车架(高维dp)的主要内容,如果未能解决你的问题,请参考以下文章

高维前缀和(sos dp)

codeforces 938F(dp+高维前缀和)

[SCOI2008] 着色方案[高维dp]

基于HDF5的高维数据有效

SPOJ Time Limit Exceeded(高维前缀和)

Codeforces 449D:Jzzhu and Numbers(高维前缀和)