Chinaunix首页 | 论坛 | 博客
  • 博客访问: 98528
  • 博文数量: 21
  • 博客积分: 145
  • 博客等级: 入伍新兵
  • 技术积分: 250
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-22 17:37
文章分类

全部博文(21)

文章存档

2013年(16)

2012年(5)

我的朋友

分类: C/C++

2013-04-01 12:22:57

原题:思路:动态规划 + 贪心
其实这道题目就是一维数组求连续数和最大的一个扩展版,而现在的任务就是要把这个二维数组的问题归结为几个一维
数组求连续数和最大的子问题,而这些子问题可以用贪心法解决。

设每一行有N个数,那么用state[i][j]记录i <= n <= j的连续数的和,那么每一行总共有N(N+1)/2种状态。把所有行垒起来,
也就是说一共有N(N+1)/2个一维数组的子问题(按列的方向看)。

思路其实就这么简单。
代码:

点击(此处)折叠或打开

  1. #include <iostream>
  2. #include <cstring>

  3. using namespace std;

  4. #define N 100

  5. int state[N][N];
  6. int array[N][N];
  7. int _max;
  8. int size;

  9. bool init() {
  10.     _max = -127;
  11.     for (int i=0; i<size; i++)
  12.         for (int j=0; j<size; j++) {
  13.             cin >> array[i][j];
  14.             if (array[i][j] > _max)
  15.                 _max = array[i][j];
  16.         }
  17.     if (_max < 0)
  18.         return true;
  19.     else
  20.         _max = 0;
  21.     return false;
  22. }

  23. void dp() {
  24.     for (int n=0; n<size; n++) {
  25.         for (int i=0; i<size; i++) {
  26.             int sum = 0;
  27.             for (int j=i; j<size; j++) {
  28.                 sum += array[n][j];
  29.                 state[i][j] += sum;
  30.                 if (state[i][j] > _max)
  31.                     _max = state[i][j];
  32.                 if (state[i][j] < 0)
  33.                     state[i][j] = 0;
  34.             }
  35.         }
  36.     }
  37. }

  38. int main() {
  39.     while (cin >> size) {
  40.         if (!init())
  41.             dp();
  42.         cout << _max << endl;
  43.     }
  44.     return 0;
  45. }



阅读(2818) | 评论(0) | 转发(0) |
0

上一篇:POJ1157解题报告

下一篇:POJ1015解题报告

给主人留下些什么吧!~~