zoukankan      html  css  js  c++  java
  • 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
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    ccs元素分类 gcelaor
    webkit Safari的样式库
    “Zhuang.Data”轻型数据库访问框架(二)框架的入口DbAccessor对象
    “Zhuang.Data”轻型数据库访问框架(一)开篇介绍
    一个基于Dapper的DbContext封装
    打造比Dictionary还要快2倍以上的字查找类
    .Net core 的热插拔机制的深入探索,以及卸载问题求救指南.
    字符串类型的自动转换与识别
    最近发现的.net core中的一些bugs
    从项目经理的角度看.net的MVC中Razor语法真的很垃圾.
  • 原文地址:https://www.cnblogs.com/zhangchengc919/p/5277738.html
Copyright © 2011-2022 走看看