【動態規劃】最大加權矩形

来源:互联网 发布:下载录音软件 编辑:程序博客网 时间:2024/05/18 02:49
题目描述给定一个正整数n( n<=100),然后输入一个N*N矩阵。求矩阵中最大加权矩形,即矩阵的每一个元素都有一权值,权值定义在整数集上。从中找一矩形,矩形大小无限制,是其中包含的所有元素的和最大 。矩阵的每个元素属于[-127,127]例:0 –2 –7 0 在左下角: 9 29 2 –6 2 -4 1-4 1 –4 1 -1 8-1 8 0 –2 和为15输入格式第一行:n,接下来是n行n列的矩阵。输出格式最大矩形(子矩阵)的和。样例输入4 0 –2 –7 0 9 2 –6 2 -4 1 –4 1 –1 8 0 –2样例输出15

最大子矩形問題,類似於吃西瓜。

ACCode:

#include <cstdio>#include <cstring>#include <cstdlib>#include <bitset>using std::max;const char fi[] = "rqnoj106.in";const char fo[] = "rqnoj106.out";const int maxN = 110;const int MAX = 0x3fffff00;const int MIN = -MAX;int sum[maxN][maxN];int w[maxN][maxN];int n, ans;  void init_file()  {    freopen(fi, "r", stdin);    freopen(fo, "w", stdout);  }    void readdata()  {    scanf("%d", &n);    for (int i = 1; i < n + 1; ++i)     for (int j = 1; j < n + 1; ++j)      scanf("%d", &w[i][j]);  }    void work()  {    for (int i = 1; i < n + 1; ++i)     for (int j = 1; j < n + 1; ++j)      sum[i][j] = sum[i - 1][j] + w[i][j];    ans = 0;    for (int i1 = 0; i1 < n; ++i1)     for (int i2 = i1 + 1; i2 < n + 1; ++i2)      {        int Max = sum[i2][1] - sum[i1][1];        int tmp = Max;        for (int j = 2; j < n + 1; ++j)        {          tmp = max(0, tmp);          tmp += sum[i2][j] - sum[i1][j];          Max = max(Max, tmp);        }        ans = max(Max, ans);      }    printf("%d", ans);  }  int main(){  init_file();  readdata();  work();  exit(0);}


原创粉丝点击