统计一个方阵中在四个方向长度为D的连续子序列的和

题目大意: 统计一个方阵中在四个方向长度为D的连续子序列的和

解题思路: 模拟

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3
  4 const int imax_n = 505;
  5 int a[imax_n][imax_n];
  6 int n, D;
  7
  8 void solve()
  9 {
 10     int ans = 0;
 11     //hang
 12     for (int i = 0; i < n; ++i)
 13     {
 14         int tmp = 0;
 15         int j = 0;
 16         while (j < D)
 17         {
 18             tmp += a[i][j];
 19             ++j;
 20         }
 21         ans = max(ans, tmp);
 22         while (j < n)
 23         {
 24             tmp = tmp - a[i][j - D] + a[i][j];
 25             ++j;
 26             ans = max(ans, tmp);
 27         }
 28     }
 29     // printf("hang ans = %d\n", ans);
 30
 31     for (int i = 0; i < n; ++i)
 32     {
 33         int tmp = 0;
 34         int j = 0;
 35         while (j < D)
 36         {
 37             tmp += a[j][i];
 38             ++j;
 39         }
 40         ans = max(ans, tmp);
 41         while (j < n)
 42         {
 43             tmp = tmp - a[j - D][i] + a[j][i];
 44             ++j;
 45             ans = max(ans, tmp);
 46         }
 47     }
 48     // printf("lei ans = %d\n", ans);
 49     // (i, 0) ++ ++
 50     for (int i = 0; i < n; ++i)
 51     {
 52         int j = 0;
 53         int tmp = 0;
 54         int k = i;
 55         while (k < n && j < D && j < n)
 56         {
 57             tmp += a[k][j];
 58             ++j;
 59             ++k;
 60         }
 61         if (j < D)
 62             continue;
 63         ans = max(ans, tmp);
 64         while (k < n && j < n)
 65         {
 66             tmp = tmp - a[k-D][j-D] + a[k][j];
 67             ans = max(ans, tmp);
 68             ++j;
 69             ++k;
 70         }
 71     }
 72     // printf("++++ans = %d\n", ans);
 73     //(0, i) ++ ++
 74     for (int i = 1; i < n; ++i)
 75     {
 76         int j = i;
 77         int k = 0;
 78         int tmp = 0;
 79         while (k < n && j < n && k < D)
 80         {
 81             tmp += a[k][j];
 82             ++k;
 83             ++j;
 84         }
 85         if (k < D)
 86             continue;
 87         ans = max(ans, tmp);
 88         while (k < n && j < n)
 89         {
 90             tmp = tmp - a[k - D ][j - D ] + a[k][j];
 91             ++j;
 92             ++k;
 93             ans = max(ans, tmp);
 94         }
 95     }
 96     // printf("++++ans = %d\n", ans);
 97
 98     for (int i = 0; i < n; ++i)
 99     {
100         int j = 0;
101         int k = i;
102         int tmp = 0;
103         while (k >= 0 && j < n && j < D)
104         {
105             tmp += a[k][j];
106             ++j;
107             --k;
108         }
109         if (j < D)
110             continue;
111         ans = max(ans, tmp);
112         while (k >= 0 && j < n)
113         {
114             tmp = tmp - a[k + D][j - D ] + a[k][j];
115             ans = max(ans, tmp);
116             --k;
117             ++j;
118         }
119     }
120     // printf("--++ans = %d\n", ans);
121
122     for (int i = 0; i < n; ++i)
123     {
124         int j = i;
125         int k = n-1;
126         int tmp = 0;
127         int step  = 0;
128         while (k >= 0 && j < n && step < D)
129         {
130             tmp += a[k][j];
131             ++j;
132             --k;
133             ++step;
134         }
135         if (step < D)
136             continue;
137         ans = max(ans, tmp);
138         while (k >= 0 && j < n)
139         {
140             tmp = tmp - a[k + D ][j - D ] + a[k][j];
141             ans = max(ans, tmp);
142             --k;
143             ++j;
144         }
145     }
146     // printf("--++ans = %d\n", ans);
147     printf("%d\n", ans);
148 }
149
150 int main()
151 {
152 #ifndef ONLINE_JUDGE
153     freopen("test.txt", "r", stdin);
154 #endif // ONLINE_JUDGE
155     scanf("%d%d", &n, &D);
156     for (int i = 0;i < n; ++i)
157     {
158         for (int j = 0; j < n; ++j)
159         {
160             scanf("%d", &a[i][j]);
161         }
162     }
163     solve();
164     return 0;
165 }

原文地址:https://www.cnblogs.com/djingjing/p/8715162.html

时间: 2024-08-24 19:00:34

统计一个方阵中在四个方向长度为D的连续子序列的和的相关文章

统计一个字符串中的单词的个数,并打印各个单词

/*测试数据:Shen zhen is a beautiful city!*/ /*运行结果:Word:6 Shen zhen is a beautiful city!*/ #include<stdio.h> #define SIZE 1000 void wordCount(char *str) { int count = 0, flag = 0; char *p = str; while (*p != '\0'){ while (*p == 32){ if (*(p + 1) == 0){/

字符串之“统计一个字符串中单词的个数”

题目:统计一个字符串中单词的个数 输入一行字符,统计其中有多少个单词,单词之间用空格分隔开 输入:my name is jacky 输出:the number of word is 4 代码如下: #include <stdio.h> int main(int argc, char *argv[]) { char str[80]; int i=0,num=0,flag=0; char c; gets(str); while((c=str[i])!='\0') { if(c==' ') flag

Java学习(4):统计一个文件中的英文,中文,数字,其他字符以及字符总数

要求:统计一个文件中的英文,中文,数字,其他字符以及字符总数(此随笔以txt文件为例) import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; /** * 将一个文件中英文,中文,数字,其

黑马程序员——统计一个字符串中各个字符出现的次数

统计一个字符串中各个字符出现的次数 import java.util.Iterator; import java.util.Set; import java.util.TreeMap; public class TreeMapDemo { //统计一个字符串中相应字符出现的次数 public static void main(String[] args) { // String s = "aagfagdlkerjgavpofjmvglk我是你的"; //调用自定义方法来 统计相应字符出

统计一个文件中出现字符&#39;a&#39;的次数

# -*- coding: utf-8 -*- #python 27 #xiaodeng #统计一个文件中出现字符'a'的次数 #http://www.cnblogs.com/hongten/p/hongten_python_count.html import os number=0 def getNumber(filePath,c): 'c---->the word numbers' #统计一个文件中出现字符'a'的次数 if os.path.exists(filePath): global

统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数,其他字符出现的次数。

/** * A:案例演示 * 需求:统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数,其他字符出现的次数. * [email protected]#$%^ * 分析:字符串是有字符组成的,而字符的值都是有范围的,通过范围来判断是否包含该字符 * 如果包含就让计数器变量自增 */ public static void main(String[] args) { String s = "[email protected]#$%^"; int big = 0; int smal

java怎么实现统计一个字符串中字符出现的次数

问题:假设字符串仅仅保护a-z 的字母,java怎么实现统计一个字符串中字符出现的次数?而且,如果压缩后的字符数不小于原始字符数,则返回. 处理逻辑:首先拆分字符串,以拆分出的字符为key,以字符出现次数为value,存入Map中. 源码如下: 1 import java.util.HashMap; 2 import java.util.Iterator; 3 import java.util.Map; 4 5 public class TestCompress { 6 7 public sta

统计一个字符串中第一次出现且频率最高的字符

统计一个字符串中第一次出现且频率最高的字符. public static char statMostRateChar(String str) { if (str != null && !"".equals(str)) { int charsStat[] = new int[128]; int charsFirstIdx[] = new int[128]; int strLen = str.length(); for (int ch = 0; ch < 128;ch

统计一个数据库中,无记录的表的sql语句

2016-05-20 SQL Server数据库中统计无记录数的表 大家使用的时候,将sql脚本中的红色[TestDB] 换成你的目标数据库名称. 1 /************************************************************ 2 * Code formatted by SoftTree SQL Assistant ?v7.0.158 3 * Time: 2016/5/19 18:47:02 4 * Author:zhangcn 5 *******