zoukankan      html  css  js  c++  java
  • 今日头条2018年笔试题

    题目:

    给定一个数组序列, 需要求选出一个区间, 使得该区间是所有区间中经过如下计算的值最大的一个: 

    区间中的最小数 * 区间所有数的和最后程序输出经过计算后的最大值即可,不需要输出具体的区间。如给定序列  [6 2 1]则根据上述公式, 可得到所有可以选定各个区间的计算值: 

      

    [6] = 6 * 6 = 36; 

    [2] = 2 * 2 = 4; 

    [1] = 1 * 1 = 1; 

    [6,2] = 2 * 8 = 16; 

    [2,1] = 1 * 3 = 3; 

    [6, 2, 1] = 1 * 9 = 9; 

    从上述计算可见选定区间 [6] ,计算值为 36, 则程序输出为 36。 

    区间内的所有数字都在[0, 100]的范围内;

    输入描述:
    第一行输入数组序列长度n,第二行输入数组序列。
    对于 50%的数据,  1 <= n <= 10000;
    对于 100%的数据, 1 <= n <= 500000;
    输出描述:
    输出数组经过计算后的最大值。
    输入例子1:
    3
    6 2 1
    输出例子1:
    36

    过了40%, 超出了限制内存,以下是代码

    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    int main(){
        int n;
        cin>>n;
        vector<int> array(n);
        for(int i=0; i<n; i++){
            cin>>array[i];
        }
        vector<int> sum(n,0);
        sum[0] = array[0];
        for(int i=1; i<n; i++)
            sum[i] = sum[i-1]+array[i];
        vector<vector<int>> dp(n, vector<int>(n,0));
        int minval = array[0];
        for(int i=0; i<n; i++){
            dp[i][i] = array[i]*array[i];
        }
        for(int i=1; i<n; i++){
            minval = array[i];
            for(int j=i-1; j>=0; j--){
                minval = min(array[j], minval);
                if(j==0)
                    dp[j][i] = sum[i]*minval;
                else
                    dp[j][i] = (sum[i]-sum[j-1])*minval;
                dp[j][i] = max(max(dp[j][i-1], dp[j][i]), dp[j+1][i]);
            }
        }
        
        cout << dp[0][n-1] << "
    ";
        return 0;
    }

    优化的话,想到的是 由于二维dp实际上是一个上三角矩阵,所以考虑压缩成一维。之后再给出优化代码吧

  • 相关阅读:
    MIME协议(一) -- RFC822邮件格式
    生活
    面向对象设计的SOLID原则、迪米特法则
    策略模式
    asp.net Json序列化
    简单工厂模式
    CSS响应式布局实例
    CSS响应式网站开发
    mysql 记录根据日期字段倒序输出
    IE下JS保存图片
  • 原文地址:https://www.cnblogs.com/jzcbest1016/p/11326563.html
Copyright © 2011-2022 走看看