题意:

给出n*m的矩阵求最大子矩阵和,要求必须把矩阵中的某一个元素替换成p

代码:

  1. //求最大子矩阵和,容易想到压缩之后dp但是这道题要求必须替换一次p,必然优先替换最小的。
  2. //这样如果求得的结果恰好等于这个矩阵所有的元素的
  3. //和但不是整个矩阵,并且没有替换元素结果就不对了,需要特判一下这种情况。比如以下两组数据:
  4. //2 2 -4 2 2 -4
  5. //1 -1 1 1
  6. //1 1 1 1 dp求出来的结果分别是2和4并且没有替换p。
  7. #include<iostream>
  8. #include<cstdio>
  9. #include<cstring>
  10. using namespace std;
  11. const int INF=0x3f3f3f3f;
  12. int mp[][],b[],c[],f[][];
  13. int n,m,p,ans;
  14. void dp()
  15. {
  16. memset(f,,sizeof(f));
  17. for(int i=;i<=m;i++){
  18. f[i][]=max(f[i-][],)+b[i];
  19. f[i][]=max(f[i-][]+b[i],f[i][]-c[i]+p);
  20. ans=max(ans,max(f[i][],f[i][]));
  21. }
  22. }
  23. void solve()
  24. {
  25. for(int i=;i<=m;i++){
  26. int sum=,min_a=INF;
  27. for(int j=i;j<=m;j++){
  28. sum+=b[j];
  29. min_a=min(min_a,c[j]);
  30. if(i==&&j==m) ans=max(ans,sum-min_a+p);
  31. else ans=max(ans,max(sum,sum-min_a+p));
  32. }
  33. }
  34. }
  35. int main()
  36. {
  37. //freopen("in.txt","r",stdin);
  38. while(scanf("%d%d%d",&n,&m,&p)==){
  39. for(int i=;i<=n;i++){
  40. for(int j=;j<=m;j++)
  41. scanf("%d",&mp[i][j]);
  42. }
  43. ans=-INF;
  44. for(int i=;i<=n;i++){
  45. memset(b,,sizeof(b));
  46. memset(c,INF,sizeof(c));
  47. for(int j=i;j<=n;j++){
  48. for(int k=;k<=m;k++){
  49. b[k]+=mp[j][k];
  50. c[k]=min(c[k],mp[j][k]);
  51. }
  52. if(i==&&j==n) solve();
  53. else dp();
  54. }
  55. }
  56. printf("%d\n",ans);
  57. }
  58. return ;
  59. }

hihocoder 1580 dp最大子矩阵和的更多相关文章

  1. hihocoder #1580 : Matrix (DP)

    #1580 : Matrix 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Once upon a time, there was a little dog YK. On ...

  2. dp - 最大子矩阵和 - HDU 1081 To The Max

    To The Max Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=1081 Mean: 求N*N数字矩阵的最大子矩阵和. ana ...

  3. ZOJ 1074 To the Max(DP 最大子矩阵和)

    To the Max Time Limit: 2 Seconds      Memory Limit: 65536 KB Problem Given a two-dimensional array o ...

  4. hdu---1506(Largest Rectangle in a Histogram/dp最大子矩阵)

    Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  5. HDU——PKU题目分类

    HDU 模拟题, 枚举1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 ...

  6. [转] HDU 题目分类

    转载来自:http://www.cppblog.com/acronix/archive/2010/09/24/127536.aspx 分类一: 基础题:1000.1001.1004.1005.1008 ...

  7. HDOJ的题目分类

    模拟题, 枚举 1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 10 ...

  8. HDU ACM 题目分类

    模拟题, 枚举1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 104 ...

  9. hdoj分类

    http://blog.csdn.net/lyy289065406/article/details/6642573 模拟题, 枚举1002 1004 1013 1015 1017 1020 1022 ...

随机推荐

  1. Pearson Distance

    Pearson Distance: where: 1.  is the covariance 2.  is the standard deviation of 3.  is the standard ...

  2. Nginx连载

    一. nginx变量(用户变量.内建变量) 用户变量 又称用户自定义变量 Nginx用户变量的可见范围是整个配置文件,甚至可以跨越不通虚拟主机的server配置,但是变量适用范围是不可以跨越自己的容器 ...

  3. Python中import的as语法

    在Python中,如果import的语句比较长,导致后续引用不方便,可以使用as语法,比如: import dir1.dir2.mod # 那么,后续对mod的引用,都必须是dir1.dir2.mod ...

  4. 1019psp

    1.本周psp: 2.本周进度条: 3.累计进度图(折线图): 4.psp饼状图:

  5. python 二维矩阵及转byte知识点

    1.注意python中的数组和list形式混合: 数组在numpy里面: 2.二维数组这样定义可以修改固定位置的值: rawDataArray_temp = [([0]*nIRImageWidth)f ...

  6. rfid工作原理

    RFID的工作原理是:标签进入磁场后,如果接收到阅读器发出的特殊射频信号,就能凭借感应电流所获得的能量发送出存储在芯片中的产品信息(即Passive Tag,无源标签或被动标签),或者主动发送某一频率 ...

  7. 【Leetcode】113Path Sum II

    Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...

  8. MySQL 事务 转自菜鸟教程 讲的清晰

    MySQL 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数 ...

  9. inline函数的总结

    在函数返回类型前加上关键字inline就可以将函数指定为内联函数: inline const string& shortString(const string &s1, const s ...

  10. 第193天:js---Math+Error+Number+Object总结

    一.Math 随机选取 //随机选取 function getRandom (begin,end){ return Math.floor(Math.random()*(end-begin))+begi ...