uva 437 The Tower of Babylon(DAG的DP)

巴比伦塔。

题目就是说人们要建造巴比伦塔,给了很多种种类不同的砖,给出的三个数据依次是砖块的长宽高,(反正我是这么理解的,不过顺序无所谓)。很显然,一个长方体有三个不同的面。在三维坐标系下就是x0y,x0z,y0z平面。这个题就是说这三个面都可以使用,来堆积砖块,但是有要求,上面的砖块的底面的长宽都要一次比下面砖块的小。

不是总面积小,要注意! 哪怕是上面砖底面的某条边跟下面平面的长度相同都不可以。然后求出这样放置的砖的最高高度是多少。

好了,这就是题目的叙述

到这里,大概就知道怎么做了。

有向无环图上的DAG

其实也有好多人是按照图论来做的。。。

我的做法是先建图。然后依次从每个顶点出发求出所能达到的最大高度。

要注意的是在上下面的比较关系时,要使得上面的面的各边要小于下面的面的各边。博主在这里不小心WA了好几次T=T.

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int Maxsize = 3000;
typedef struct
{
    int x,y,h;
} node;
int cnt;
node data[Maxsize];
int d[Maxsize];
int G[Maxsize][Maxsize];
int main()
{
    int dp(int x);
    void init_map();
    int ncase;
    int x,y,z;
    int k =0;
    while(cin>>ncase && ncase)
    {
        memset(G,0,sizeof(G));
        memset(d,0,sizeof(d));
        memset(data,0,sizeof(data));
        cnt = 0;
        for(int i = 0 ; i < ncase; i++)/*立方体砖块有三个底面,依次作为一个顶点存入*/
        {
            cin>>x>>y>>z;
            data[cnt].x = x;
            data[cnt].y = y;
            data[cnt++].h = z;
            data[cnt].x = y;
            data[cnt].y = z;
            data[cnt++].h = x;
            data[cnt].x = z;
            data[cnt].y = x;
            data[cnt++].h = y;
        }
        init_map();
        for(int i = 0 ; i < cnt ; i++)/*求出从每个顶点出发所能完成的最高高度*/
        {
            dp(i);
        }
        int maxt = 0;
        for(int i = 0 ; i < cnt ; i++)
        {
            if(maxt <= d[i])
            {
                maxt = d[i];
            }
        }
        printf("Case %d: maximum height = %d\n",++k,maxt);
    }
    return 0;
}

void init_map()/*i,j符合条件,建立从i,j的有向边,形成一个有向图*/
{
    for(int i = 0 ; i < cnt ; i++)
    {
        for(int j = 0 ; j < cnt ; j++)
        {

            if((data[i].x > data[j].x && data[i].y > data[j].y )|| (data[i].x > data[j].y && data[i].y > data[j].x))/*砖块的放置方向*/
            {
                G[i][j] = 1;
            }
        }
    }
}

int dp(int i)/*dp求最优解*/
{
    int maxx = 0;
    if(d[i] > 0)
    {
        return d[i];
    }
    for(int j = 0 ; j < cnt ; j++)
    {
        if(G[i][j])
        {
            if(maxx < dp(j))
            {
                maxx = dp(j);
            }
        }
    }
    return d[i] = maxx + data[i].h ;
}


然后这几有一些测试数据,大家可以测测。

/*input*/
1
16839 5759 10114
2
17516 31052 5628
23011 7420 16213
3
4087 2750 12768
9085 12061 32226
17544 25090 21184
4
25138 25567 26967
4979 20496 10312
11368 30055 17032
13146 19883 25737
5
30525 28506 28395
22103 24852 19068
12755 11654 6562
27097 13629 15189
32086 4144 6968
6
31407 24166 13404
25563 24835 31354
921 10445 24804
7963 19319 1423
31328 10458 1946
14480 29984 18752
7
3895 18671 8260
16249 7758 15630
13307 28607 13991
11739 12517 1415
5263 17117 22826
3182 13135 25344
8023 11234 7537
8
9761 9980 29072
1202 21337 13062
22161 24006 30730
7645 27476 31694
25515 14140 22089
26522 5203 9172
4435 28318 24583
6816 4587 9654
9
26307 7175 18452
23449 6474 32435
8194 14111 24749
28211 29321 32050
12957 14163 4167
14998 7794 32311
21392 19800 7927
14906 25886 2583
15611 5001 8053
10
30966 20121 32381
15640 26205 24386
12476 15726 17266
3215 19472 11377
4698 25544 23298
14620 23088 3124
31550 18066 24257
18974 20902 25614
6158 9900 9268
22414 9599 18527
11
13712 10047 14567
18537 15989 19879
13627 4274 8388
1172 32018 3753
12389 21192 11484
18123 11745 18529
15586 5364 20160
5642 18177 9576
28579 27364 27686
29345 19490 17714
5512 21462 22627
12
8646 3497 26704
6271 13871 11530
27500 4501 8608
5809 15726 12458
16543 16475 11532
17223 3953 17025
19895 24016 18248
11277 26279 19366
8747 21977 18093
25852 29089 29164
2232 26234 29733
21107 5412 9875
13
5449 9345 27590
17575 1192 6790
696 11736 20365
17041 17893 5036
26980 1093 851
12391 20196 669
20532 29990 12282
23903 12971 32187
19572 3681 7262
26188 28530 24191
447 24234 13709
11864 6682 6002
2500 3787 5215
14
25830 1323 25908
19629 13193 7506
5991 20130 10876
19830 31592 12389
6043 9834 1776
4720 343 28995
31393 20510 31314
20678 1283 11512
4796 3475 6470
2751 880 30990
30135 29753 28365
4881 5630 2236
21333 24146 3357
5244 3080 3989
15
808 24980 31358
915 21188 3541
14023 10150 610
29010 24834 16697
5433 25000 28864
16370 28677 24078
7702 1692 19841
28704 16516 22230
32421 19818 16265
19325 29344 1463
28930 3547 17044
18968 326 12684
15635 6323 16643
25396 11613 22865
29911 21986 23127
16
13989 686 6979
31051 16477 6366
21127 4194 8682
11012 23059 1250
31248 24732 28651
20775 7981 20834
27869 7779 23625
11116 1646 15893
29409 7940 17286
16203 28019 11335
4059 7063 3785
11902 6685 14290
27142 16703 26854
13459 28529 23364
21088 19053 31236
15110 17076 11756
17
10676 289 32054
14158 5759 5223
17489 18946 10295
11201 5172 14306
7952 6602 23609
7215 6378 13866
25370 27216 8031
178 16850 11338
2700 23100 8532
11518 17568 28480
9967 2598 14886
12342 15228 27150
786 29616 6477
20754 4237 7731
19669 21211 27520
27609 5143 7000
20450 14247 18639
18
2942 12482 23727
16739 26048 28948
3301 21640 17997
23867 14786 27572
25357 12634 27290
20552 20313 14427
7358 8057 16253
20411 2385 4354
2030 23580 27883
31883 21578 31369
11503 18903 21013
31366 30380 14257
19245 27871 13366
9620 27666 21294
29442 19485 12760
15401 6212 4145
15336 22705 32521
23790 32122 21914
19
23572 12370 2771
1595 888 18094
32318 11189 27641
4296 12491 25860
3107 24787 17098
5063 27944 31248
12293 16847 3963
28480 27585 21353
32045 31696 16499
4715 9738 17347
28483 24065 24947
9823 19266 2869
12793 3991 19562
16960 9918 29755
22105 25746 30348
25826 11981 18339
12466 25491 24542
20600 8098 26678
511 15348 14668
20
16317 10674 8164
14648 12818 29966
28872 16486 6847
29938 6242 5862
24671 28167 26880
27446 30408 11639
31114 11102 22517
28015 13899 21453
8118 1365 12927
20466 13846 25033
1697 18586 13456
93 18289 31756
29168 27413 25031
31718 24843 28573
26394 27829 11806
3661 5839 9047
18183 23773 12355
15378 14886 22760
22935 1904 6160
26146 10046 26848
21
17402 29784 4168
782 24288 2348
23403 19965 14712
10638 20694 29418
30938 24314 15542
2529 23020 21619
3717 5403 16271
18243 8469 22046
30603 18287 30560
22675 25147 1020
31244 20198 26871
7909 449 7328
28486 17623 14891
10884 10944 1202
10702 24683 3525
8896 27277 24799
12512 25523 24312
25210 26360 2913
28760 17149 26684
2878 8572 12335
16332 7325 578
22
636 26664 17062
20452 9545 16985
28694 19976 10520
21473 19642 9350
23392 30564 22185
19959 42 27667
23364 25345 2411
28636 1007 20069
26661 20563 29324
13765 21308 7774
10684 9014 8217
28835 15572 15242
2304 24755 929
3418 32049 12019
19932 17622 22210
14670 21099 20556
4663 12445 22110
16761 25575 14545
18340 30611 18190
24550 18321 24082
25265 6023 24848
19522 24629 7553
23
26279 20874 4030
32490 13360 31353
30280 8718 20561
23190 8584 796
10688 26340 23936
3989 27704 27959
10213 19568 10554
13369 32048 13069
20612 4155 23430
28896 13394 30909
5961 30170 5463
27324 23930 32150
29306 9150 32725
32585 6225 414
26282 12390 11358
4888 17533 1556
12300 9491 26461
24912 14184 22705
17413 20962 20383
3609 5812 7169
20795 12287 13772
27845 6685 11256
29228 26961 27449
24
9087 8527 1212
26132 8646 11553
18628 26111 25150
17829 32049 12560
29669 4168 23051
15589 17747 28930
12411 792 25986
18738 13953 8577
1376 18486 24923
16942 1558 10701
31409 1827 8214
32302 23681 30162
28391 22501 32717
7769 28080 31600
18950 31358 12422
27805 17718 16491
26229 30113 12017
9513 28752 1016
2554 19165 6201
30465 7860 22213
13807 15445 5711
27378 19418 21995
7342 32707 26840
9708 13594 22821
25
23237 7255 11689
5004 32204 8789
23916 1200 13425
24409 6491 27656
21594 13311 3073
12039 5088 1698
23527 7449 17498
15803 19650 30556
25892 1021 18268
14367 23409 12849
29763 22043 23253
31441 21811 32627
19089 13159 2371
2157 13214 22435
10194 2542 888
8767 24113 27575
12207 22419 15374
22114 1583 7671
23203 18715 13898
32732 19106 20254
24202 29609 29919
4339 11065 1367
22971 15724 20908
32203 23380 1627
29780 9207 32366
26
11540 15234 29615
20000 23206 12029
26187 20030 16344
7238 10498 10378
14565 5541 23809
153 28919 22012
15694 6791 16741
5447 18016 16474
18605 6646 15226
4663 30000 4843
9675 11591 32688
1617 10567 21863
4490 24866 19267
3474 4786 29559
1747 19214 23411
25998 19172 12121
17892 29085 15896
29906 23337 28249
25700 31272 6255
30277 620 6275
1957 14267 23193
12404 10235 14780
8192 6557 25115
8567 15091 24864
1066 17562 15203
713 381 5212
27
5372 2298 29211
11591 254 16218
3575 6086 8668
25661 8170 1394
17559 1233 11378
5917 23513 28686
18477 30618 4305
27739 23059 22354
1489 7169 17782
5256 9897 15440
14267 7271 8897
11155 5590 20689
27896 25013 17799
32486 23872 18352
20054 12886 20470
6585 3663 29031
24322 16429 32382
11717 4275 19257
17193 30221 6231
32076 976 13336
1181 4158 18149
1032 30636 8509
19787 28691 17663
28540 10641 7442
4359 22938 3819
13256 20094 17874
5108 4851 13709
28
24808 25894 5653
4253 24527 8981
31999 31485 12314
26734 16418 27960
17193 13235 23957
13108 24592 12468
27365 10251 10310
7628 30624 21417
15122 18657 3232
17962 9141 24601
21528 19696 32344
4701 13920 23943
32692 15246 30592
21050 19331 6282
8574 21618 17834
16093 18280 4305
18979 21575 27936
4370 30636 16882
8170 22431 31025
24432 2999 6383
31226 20854 6447
11942 12437 6234
24704 8298 11393
2638 31977 24198
21151 13658 3333
2625 13401 25883
27608 26620 11663
18493 28315 22286
29
30022 29114 13127
27488 3343 12751
19427 1223 15161
707 21134 37
31670 1367 12876
24126 5070 18700
12432 31834 13445
23575 909 15008
22477 24357 317
11309 17516 6351
13102 11511 25771
17627 23311 31077
23492 6968 13310
9130 1545 19128
31887 741 20436
25483 5532 30714
3890 28031 16847
9262 19534 9721
20976 28036 9375
8626 18927 27867
13521 20019 19121
8644 13684 3854
19611 2085 13927
29410 30431 27535
9475 15372 8073
5214 2311 14637
16456 10902 9286
10592 27645 27256
24850 10296 4357
30
1767 15207 23932
5191 21886 4311
27810 4348 8302
825 24588 18753
14872 23057 3076
4958 11886 3774
9593 20436 11786
28518 2167 13352
3851 1186 27240
30322 32691 9704
29708 9636 18113
26812 32570 15003
11663 22166 29780
11751 28652 5522
907 7771 19895
28634 13784 21587
6720 26067 4533
11720 25950 14090
20383 16149 6736
3549 23117 13446
12372 14825 5805
16550 18697 9527
12195 9029 22661
28709 24961 5451
13110 24598 324
9536 7545 3289
15252 20631 14588
30938 18298 26045
27604 11 2271
31462 7517 18832
0


下面是输出

/*output*/
Case 1: maximum height = 22598
Case 2: maximum height = 52893
Case 3: maximum height = 87628
Case 4: maximum height = 128393
Case 5: maximum height = 181340
Case 6: maximum height = 145151
Case 7: maximum height = 81755
Case 8: maximum height = 157088
Case 9: maximum height = 165768
Case 10: maximum height = 183029
Case 11: maximum height = 230211
Case 12: maximum height = 221399
Case 13: maximum height = 219313
Case 14: maximum height = 204300
Case 15: maximum height = 218228
Case 16: maximum height = 264789
Case 17: maximum height = 243283
Case 18: maximum height = 295389
Case 19: maximum height = 284190
Case 20: maximum height = 357167
Case 21: maximum height = 314412
Case 22: maximum height = 287459
Case 23: maximum height = 342924
Case 24: maximum height = 288081
Case 25: maximum height = 348225
Case 26: maximum height = 321238
Case 27: maximum height = 303123
Case 28: maximum height = 364003
Case 29: maximum height = 333415
Case 30: maximum height = 383791






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值