zoukankan      html  css  js  c++  java
  • 百度--最大和

    在一个N*N的数组中寻找所有横,竖,左上到右下,右上到左下,四种方向的直线连续D个数字的和里面最大的值 

    输入描述:

    每个测试输入包含1个测试用例,第一行包括两个整数 N 和 D :
    3 <= N <= 100
    1 <= D <= N
    接下来有N行,每行N个数字d:
    0 <= d <= 100

    输出描述:

    输出一个整数,表示找到的和的最大值

    输入例子:

    4 2
    87 98 79 61
    10 27 95 70
    20 64 73 29
    71 65 15 0

    输出例子:

    193

    基本思路:分四种情况获取所求和:

    1、从左到右,按行去遍历数组

    2、从上到下,按列遍历数组

    3、从左上到右下遍历数组

    4、从左下到右上遍历数组

    #include<bits/stdc++.h>
    using namespace std;
    
    int main()
    {
        int n,d;
        cin>>n>>d;
        int** p = new int*[n];
        int max_sum=0;
        for (int i = 0; i <n; ++i)
        {
            p[i] = new int[n];
        }
        for (int i = 0; i < n; ++i)
        {
            for (int j = 0; j < n; ++j)
            {
                cin >> p[i][j];
            }
        }
    
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n-d+1;j++)
            {
                int sum=0;
                for(int k=j;k<j+d;k++)
                {
                    sum+=p[i][k];
                }
                    if(max_sum<sum)
                    max_sum=sum;
            }
        }
        
        for(int j=0;j<n;j++)
        {
            for(int i=0;i<n-d+1;i++)
            {
                int sum=0;
                for(int k=i;k<i+d;k++)
                {
                    sum+=p[k][j];
                }
                if(max_sum<sum)
                    max_sum=sum;
            }
        }
       
        for(int i=0;i<n-d+1;i++)
        {
            for(int j=0;j<n-d+1;j++)
            {
                int sum=0;
                int q=j;
                for(int k=i;k<d+i;k++)
                {
                    sum+=p[k][q];
                    q++;
                }
    
                    if(max_sum<sum)
                    max_sum=sum;
            }
        }
       
        for(int i=n-1;i>=d-1;i--)
        {
            for(int j=0;j<n-d+1;j++)
            {
                int sum=0;
                int q=j;
                for(int k=i;k>=i-d+1;k--)
                {
    
                    sum+=p[k][q];
                    q++;
                }
    
                    if(max_sum<sum)
                    max_sum=sum;
            }
        }
        cout<<max_sum<<endl;
    /*
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
                cout<<p[i][j]<<" ";
            cout<<endl;
        }
    */
        return 0;
    }
  • 相关阅读:
    Sql Server2005新特性及性能
    Sql Server Debugger
    .关于 WCF Binding 中 OpenTimeout, CloseTimeout, SendTimeout, ReceiveTimeout 的解释(转载)
    LightSwitch™初体验
    WinDbg / SOS Cheat Sheet
    《Dissecting SQL Server Execution Plans》随记
    轻松掌握用SQL来合并查询
    Oracle:存储过程的使用
    Eclipse和Tomcat的版本问题已解决
    oracle:触发器的使用
  • 原文地址:https://www.cnblogs.com/omelet/p/6822049.html
Copyright © 2011-2022 走看看