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
7AC代码:
#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;
}

时间: 2024-10-14 20:28:41

hihocoder-1274 自行车架(高维dp)的相关文章

[hihocoder 1033]交错和 数位dp/记忆化搜索

#1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0,?a1,?...,?an?-?1,定义交错和函数: f(x)?=?a0?-?a1?+?a2?-?...?+?(?-?1)n?-?1an?-?1 例如: f(3214567)?=?3?-?2?+?1?-?4?+?5?-?6?+?7?=?4 给定 输入 输入数据仅一行包含三个整数,l,?r,?k(0?≤?l?≤?r?≤?1018,?|k|

hihoCoder #1033 : 交错和 [ 数位dp ]

传送门 #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错和函数: f(x) = a0 - a1 + a2 - ... + ( - 1)n - 1an - 1 例如: f(3214567) = 3 - 2 + 1 - 4 + 5 - 6 + 7 = 4 给定 l, r, k,求在 [l, r] 区间中,所有 f(x) = k 的 x 的和,即

hihocoder 1158 质数相关 dp

描述 两个数a和 b (a<b)被称为质数相关,是指a × p = b,这里p是一个质数.一个集合S被称为质数相关,是指S中存在两个质数相关的数,否则称S为质数无关.如{2, 8, 17}质数无关,但{2, 8, 16}, {3, 6}质数相关.现在给定一个集合S,问S的所有质数无关子集中,最大的子集的大小. 输入 第一行为一个数T,为数据组数.之后每组数据包含两行. 第一行为N,为集合S的大小.第二行为N个整数,表示集合内的数. 输出 对于每组数据输出一行,形如"Case #X: Y&q

hihocoder 1124 : 好矩阵 dp

好矩阵 时间限制:3000ms 单点时限:1000ms 内存限制:256MB 描述 给定n, m.一个n?×?m矩阵是好矩阵当且仅当它的每个位置都是非负整数,且每行每列的和?≤?2.求好矩阵的个数,模109?+?7 输入 第一行一个整数T,表示测试点个数.下面T个测试点.每个测试点一行,包含两个整数n,m.1?≤?T?≤?104. 1?≤?n,?m?≤?100. 输出 T行.每行是对应测试点的答案. 样例输入 1 2 2 样例输出 26 题意很简单,由于,数量很大,如果考虑一个一个方格的放,要考

Hihocoder #1479 : 三等分 树形DP

三等分  描述 小Hi最近参加了一场比赛,这场比赛中小Hi被要求将一棵树拆成3份,使得每一份中所有节点的权值和相等. 比赛结束后,小Hi发现虽然大家得到的树几乎一模一样,但是每个人的方法都有所不同.于是小Hi希望知道,对于一棵给定的有根树,在选取其中2个非根节点并将它们与它们的父亲节点分开后,所形成的三棵子树的节点权值之和能够两两相等的方案有多少种. 两种方案被看做不同的方案,当且仅当形成方案的2个节点不完全相同. 输入 每个输入文件包含多组输入,在输入的第一行为一个整数T,表示数据的组数. 每

Hihocoder #1527 : 快速乘法 DP

时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 在写代码时,我们经常要用到类似 x × a 这样的语句( a 是常数).众所周知,计算机进行乘法运算是非常慢的,所以我们需要用一些加法.减法和左移的组合来实现乘一个常数这个操作.具体来讲, 我们要把 x × a 替换成:(x<<a0) op1 (x<<a1) op2 (x<<a2) ... opn (x<<an) 这样的形式,其中opi 是+或者-. 举个例子:x × 15 = (

HihoCoder 1063 : 缩地 树形DP第二题(对象 边)

时间限制:12000ms 单点时限:1000ms 内存限制:256MB 描述 编织者是 Dota 系列中的一个伪核,拥有很强的生存能力和线上消耗能力.编织者的代表性技能是缩地.缩地带来的隐身.极限移动速度和伤害让它拥有很高的机动性以及赖线和收割的能力. 假设当前作战区域是一棵有根树,编织者所在的位置为根节点1,树中每个节点,有一个权值vi,代表这个节点的收益.树中的每条边,有一个权值wi,代表每条边的长度.编织者从根结点出发,最远累计移动d 距离时,所能得到的收益的最大值是多少?注意重复经过一个

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

321. [SCOI2008] 着色方案 ★★★   输入文件:color.in   输出文件:color.out   简单对比时间限制:1 s   内存限制:64 MB 题目背景: 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i 种颜色的油漆足够涂ci 个木块.所有油漆刚好足够涂满所有木块,即 c1+c2+...+ck=n.相邻两个木块涂相同色显得很难看,所以你希望统计任意两个相邻木块颜色不同的着色方案.[输入]第一行为一个正整数k,第二行包含k个整数c1, c2,

hihocoder #1076 与链 dp

直接背包不可做 我们只需要知道每个数位上有多少个$1$,那么我们就能构造出解 因此,我们对每一位讨论, 可以拆出$n + \frac{n}{2} + \frac{n}{4} + ... = 2n$个物品,然后去做背包 加上足够的剪枝就可以过了... 复杂度$O(Tn^2)$ #include <set> #include <vector> #include <cstdio> #include <cstring> #include <iostream&g