• noi 1768 最大子矩阵


    题目链接:http://noi.openjudge.cn/ch0206/1768/

    可能是数据修改了吧,O(n6)过不了了。

    主要是在求一个矩阵的和时,重复计算了很多次。

    矩阵首先压缩一下。在输入的时候,就计算好每一列的和于a[i][j]中。

    dp:

    枚举上界(第一重循环),枚举下界(第二重循环),枚举列数(第三重循环),总的时间复杂度为O(n3);

    怎么得到这一列的和呢? 就是利用预处理的 a 数组。temp= a[j][k] - a[i-1][k];

    然后这一列上的 dp 方程 f[k] = max(f[k-1]+temp,temp);  //选还是不选这一列;

    temp2 = max(f[k]) 是这一列的最优值。循环完后,就是 ans = max(temp2) 只一个区间的最优值了。

    /*
    #include<iostream>
    using namespace std;
    
    #define INF 0x3f3f3f3f
    
    const int Maxn = 110;
    int a[Maxn][Maxn];
    
    int main()
    {
        int n;
        cin>>n;
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                cin>>a[i][j];
    
        int ans = -INF;
        int sum = 0;
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                for(int r=i; r<=n; r++)
                {
                    for(int c=j; c<=n; c++)
                    {
                        sum = 0;
                        for(int k=i;k<=r;k++) {
                            for(int t=j;t<=c;t++) {
                                sum +=a[k][t];
                            }
                        }
                        if(sum>ans)
                            ans = sum;
                    }
                }
            }
        }
    
        cout<<ans<<endl;
    
    
        return 0;
    }
    */
    
    
    #include <bits/stdc++.h>
    using namespace std;
    
    const int INF = 0x3f3f3f3f;
    const int Maxn = 110;
    int a[Maxn][Maxn];
    int f[Maxn];
    int n;
    
    int main()
    {
        int ans = -INF;
    
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
            {
                scanf("%d",&a[i][j]);
                a[i][j] +=a[i-1][j];
            }
    
        for(int i=1; i<=n; i++)
        {
            for(int j=i; j<=n; j++)
            {
                memset(f,0,sizeof(f));
                int temp1 = -INF;
                for(int k=1; k<=n; k++)
                {
                    int temp2 = a[j][k] - a[i-1][k];
                    f[k] = max(f[k-1]+temp2,temp2);
                    temp1 = max(temp1,f[k]);
                }
                ans = max(ans,temp1);
            }
        }
    
        printf("%d
    ",ans);
    
    
    
        return 0;
    }
  • 相关阅读:
    net core 接入 Google Authenticator
    centos7 安装Mysql8.0笔记
    学习笔记: AOP面向切面编程和C#多种实现
    Exceptionless 生产部署笔记
    图片上下左右自适应对齐
    rem
    mysql command line client 使用命令
    文字溢出换行或者省略号
    一个自欺欺人的代码(便于理解函数和对象基础)
    this、new、模式工厂、创建新的构造函数
  • 原文地址:https://www.cnblogs.com/TreeDream/p/6028227.html
Copyright © 2020-2023  润新知