UVA 10755 Garbage Heap

来源:互联网 发布:linux打开大文件 编辑:程序博客网 时间:2024/05/17 03:15

利用前缀进行求和加速,然后把问题转换为一维的dp问题(或者说是简单的递推问题)

#include <stdio.h>#include <vector>using namespace std;#defineMIN_INF0x8000000000000000const int max_n = 20 + 10;long long arr[max_n][max_n][max_n];long long sum[max_n][max_n][max_n];void func(int A, int B, int C){int i, j, k;static int case_n = 1;long long cur_sum, max_sum;int start_j, start_k, end_j, end_k;for(i=1; i<=A; i++){for(j=1; j<=B; j++){for(k=1; k<=C; k++){sum[i][j][k] = sum[i][j-1][k] + sum[i][j][k-1] - sum[i][j-1][k-1] + arr[i][j][k];}}}vector<long long> v;long long dp[max_n];max_sum = MIN_INF;for(start_j=1; start_j<=B; start_j++){for(start_k=1; start_k<=C; start_k++){for(end_j=start_j; end_j<=B; end_j++){for(end_k=start_k; end_k<=C; end_k++){v.clear();for(i=1; i<=A; i++){cur_sum = sum[i][end_j][end_k] + sum[i][start_j-1][start_k-1] - sum[i][start_j-1][end_k] - sum[i][end_j][start_k-1];v.push_back(cur_sum);}for(i=0; i<v.size(); i++){if(0 == i){dp[i] = v[i];}else{if(dp[i-1] < 0)dp[i] = v[i];elsedp[i] = dp[i-1] + v[i];}if(max_sum < dp[i])max_sum = dp[i];}}}}}if(case_n >= 2)printf("\n");printf("%lld\n", max_sum);case_n++;}int main(void){int t;int i, j, k;int A, B, C;//freopen("input.dat", "r", stdin);scanf("%d", &t);while(t--){scanf("%d %d %d", &A, &B, &C);for(i=1; i<=A; i++){for(j=1; j<=B; j++){for(k=1; k<=C; k++){scanf("%lld", arr[i][j]+k);}}}func(A, B, C);}return 0;}



0 0
原创粉丝点击