• 每日编程-20170319


    题目:在一个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

    解答:

    其实没啥好分析的,遍历每一个数,然后找这个数横向和纵向的N-1个数的和,找到最大值。

    接着找每个数的右下和左下N-1个数的和,求取最大值。

    唯一值得注意的就是不要越界。

     1 #include <iostream>
     2 #include <string>
     3 #include <vector>
     4 #include <math.h>
     5 using namespace std;
     6 int Max(int a, int b) { return a < b ? b : a; }
     7 int N, D, a, answer;
     8 int rowAndCol (const vector<vector<int>> &v, int ans) {
     9     int sumR = 0, sumC = 0;
    10     for (size_t i = 0; i < v.size() - D + 1; i++)
    11     {
    12         for (size_t j = 0; j < v[0].size() - D + 1; j++)
    13         {
    14             for (size_t k = 0; k < D; k++)
    15             {
    16                 sumR += v[i][j + k];
    17                 sumC += v[i + k][j];
    18             }
    19             ans = Max(sumR, Max(sumC, ans));
    20             sumR = sumC = 0;
    21         }
    22     }
    23     return ans;
    24 }
    25 int duiJiaoXian (const vector<vector<int>> &v, int ans) {
    26     int sum1030 = 0, sum0130 = 0;
    27     for (size_t i = 0; i < v.size() - D + 1; i++)
    28     {
    29         for (size_t j = 0; j < v.size() - D + 1; j++)
    30         {
    31             for (size_t k = 0; k < D; k++)
    32             {
    33                 sum1030 += v[i + k][j + k];
    34                 sum0130 += v[i + k][v.size() - j - k - 1];
    35             }
    36             ans = Max(sum1030, Max(sum0130, ans));
    37             sum1030 = sum0130 = 0;
    38         }
    39     }
    40     return ans;
    41 }
    42 int main() {
    43     cin >> N >> D;
    44     vector<int> vNei;
    45     vector<vector<int>> vWai(N);
    46     for (auto j = 0; j < N; j++)
    47     {
    48         for (auto i = 0; i < N; i++)
    49         {
    50             cin >> a;
    51             vWai[j].push_back(a);
    52         }
    53     }
    54     answer = rowAndCol(vWai,answer);
    55     answer = duiJiaoXian(vWai, answer);
    56     cout << answer;
    57 }
  • 相关阅读:
    C# 根据二级栏目Id查询出所属文章的信息列表
    C#网站首页制作MVC
    C#Mvc退出登录
    C#Mvc修改密码
    C#网站开发之内容页Content
    C#Mvc登录功能
    Linux命令——shell
    学习笔记cisco常用命令
    性能相关术语
    Linux命令(一)
  • 原文地址:https://www.cnblogs.com/linhaowei0389/p/6581117.html
Copyright © 2020-2023  润新知