您的位置:首页 > 其它

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

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

[code]#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: