UVa 10755 Garbage Heap

本文探讨了三维形式下的最大子段问题,并将其压缩为一维情况求解。通过枚举边界并使用动态规划思想,文章给出了具体实现的代码示例,最终解决了问题并分享了解决过程中的调试经验。

三维的形式下的最大子段问题

既然二维可以压缩成一维的情况,那么同样的,三维也可以压缩成一维转化成最大子段问题

枚举y和z的边界,压缩后在x轴上求最大子段,用ans记录最大值

时间复杂度是O(n^5),由于数据不算太大,所以不会超时

 

一直WA,一直WA,Orz

后来终于发现是输出格式的问题,每个输出之间都要加一个换行符,换行啊换行!你坑死窝了

为何反馈信息是WA而不是PE,真是误导人啊。=_=!!

 

 1 //#define LOCAL
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <algorithm>
 6 using namespace std;
 7 
 8 const int maxn = 30;
 9 long long cube[maxn][maxn][maxn], sum[maxn][maxn][maxn], a[maxn];
10 const long long INF = 1LL << 60;
11 
12 int main(void)
13 {
14     #ifdef LOCAL
15         freopen("10755in.txt", "r", stdin);
16     #endif
17 
18     int T;
19     scanf("%d", &T);
20     while(T--)
21     {
22         int x, y, z;
23         int i, j, k;
24         scanf("%d%d%d", &x, &y, &z);
25         for(i = 1; i <= x; ++i)
26             for(j = 1; j <= y; ++j)
27                 for(k = 1; k <= z; ++k)
28                     scanf("%lld", &cube[i][j][k]);
29         memset(sum, 0, sizeof(sum));
30         for(i = 1; i <= x; ++i)
31             for(j = 1; j <= y; ++j)
32                 for(k = 1; k <= z; ++k)
33                     sum[i][j][k] = sum[i][j-1][k] + sum[i][j][k-1] - sum[i][j-1][k-1] + cube[i][j][k];
34 
35         long long ans = -INF;
36         for(int i1 = 1; i1 <= y; ++i1)
37             for(int i2 = i1; i2 <= y; ++i2)
38                 for(int j1 = 1; j1 <= z; ++j1)
39                     for(int j2 = j1; j2 <= z; ++j2)
40                     {
41                         for(k = 1; k <= x; ++k)
42                             a[k] = sum[k][i2][j2] - sum[k][i1-1][j2] - sum[k][i2][j1-1] + sum[k][i1-1][j1-1];
43 
44                         ans = max(a[1], ans);
45                         for(k = 2; k <= x; ++k)
46                         {
47                             a[k] = max(a[k], a[k] + a[k-1]);
48                             ans = max(ans, a[k]);
49                         }
50                     }
51 
52         printf("%lld\n", ans);
53         if(T)
54             printf("\n");
55     }
56     return 0;
57 }
萌萌的代码君

 

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/3896774.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值