【动态规划】[POJ 1050]To the Max

就是最大矩阵和,如果直接爆搜复杂度就是O(n4)的所以进行优化,sum[i][j][k]表示在第i列到第j列的第k行的和,那么就枚举i, j然后最大子段和,然后就变成O(n3)了, 反正n只有100就过了

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 100;
int sum[MAXN+10][MAXN+10][MAXN+10], dp[MAXN+10];
int main(){
    int n;
    scanf("%d", &n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            scanf("%d", &sum[j][j][i]);
    int ans = 0;
    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++){
            for(int k=1;k<=n;k++)
                sum[i][j][k] = sum[i][j-1][k]+sum[j][j][k];
            for(int k=1;k<=n;k++) 
                ans = max(ans, (dp[k] = (dp[k-1]<0?sum[i][j][k]:dp[k-1]+sum[i][j][k])));
        }
    printf("%d\n", ans);

    return 0;
}

posted on 2015-06-19 13:17  JeremyGuo  阅读(109)  评论(0编辑  收藏  举报

导航