这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大。注意:选出的k个子矩阵不能相互重叠。

题解:m很小分类讨论,m==1时怎么搞都可以,m==2时,dp[i][j][k]表示第一列枚举到i,第二列枚举到j,花了k次操作的最大子矩阵和,然后转移有三种一种是只转移i,一种是只转移j,还有一种是ij都转移,然后我们需要枚举空出来的地方的终点,我们预处理出ma[i][j]表示从i+1到j的后缀最大和,三维是三种转移所需要的的情况,然后可以O(3*N^3)的解决

  1. /**************************************************************
  2. Problem: 1084
  3. User: walfy
  4. Language: C++
  5. Result: Accepted
  6. Time:748 ms
  7. Memory:2716 kb
  8. ****************************************************************/
  9.  
  10. //#pragma comment(linker, "/stack:200000000")
  11. //#pragma GCC optimize("Ofast,no-stack-protector")
  12. //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  13. //#pragma GCC optimize("unroll-loops")
  14. #include<bits/stdc++.h>
  15. #define fi first
  16. #define se second
  17. #define mp make_pair
  18. #define pb push_back
  19. #define pi acos(-1.0)
  20. #define ll long long
  21. #define vi vector<int>
  22. #define mod 1000000007
  23. #define C 0.5772156649
  24. #define ls l,m,rt<<1
  25. #define rs m+1,r,rt<<1|1
  26. #define pil pair<int,ll>
  27. #define pli pair<ll,int>
  28. #define pii pair<int,int>
  29. #define cd complex<double>
  30. #define ull unsigned long long
  31. #define base 1000000000000000000
  32. #define fio ios::sync_with_stdio(false);cin.tie(0)
  33.  
  34. using namespace std;
  35.  
  36. const double eps=1e-;
  37. const int N=+,maxn=+,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f;
  38.  
  39. int n,m,K;
  40. ll a[N][],sum[N][],ma[N][N][];
  41. ll dp[N][N][];
  42. void prepare()
  43. {
  44. if(m==)
  45. {
  46. for(int j=;j<=n;j++)a[j][]=-1e9;
  47. m=;
  48. }
  49. for(int i=;i<=n;i++)
  50. {
  51. sum[i][]=sum[i-][]+a[i][];
  52. sum[i][]=sum[i-][]+a[i][];
  53. sum[i][]=sum[i-][]+a[i][]+a[i][];
  54. }
  55. for(int i=;i<=;i++)
  56. {
  57. for(int j=;j<=n;j++)
  58. {
  59. for(int k=j+;k<=n;k++)
  60. {
  61. for(int l=j;l<=k;l++)
  62. {
  63. ma[j][k][i]=max(ma[j][k][i],sum[k][i]-sum[l][i]);
  64. }
  65. }
  66. }
  67. }
  68. }
  69. void gao()
  70. {
  71. for(int i=;i<=K;i++)
  72. {
  73. for(int j=;j<=n;j++)
  74. {
  75. for(int k=;k<=n;k++)
  76. {
  77. for(int l=j+;l<=n;l++)
  78. {
  79. dp[l][k][i]=max(dp[l][k][i],dp[j][k][i-]+ma[j][l][]);
  80. }
  81. for(int l=k+;l<=n;l++)
  82. {
  83. dp[j][l][i]=max(dp[j][l][i],dp[j][k][i-]+ma[k][l][]);
  84. }
  85. for(int l=max(j,k)+;l<=n;l++)
  86. {
  87. dp[l][l][i]=max(dp[l][l][i],dp[j][k][i-]+ma[max(j,k)][l][]);
  88. }
  89. }
  90. }
  91. }
  92. ll ans=;
  93. for(int i=;i<=n;i++)
  94. for(int j=;j<=n;j++)
  95. for(int k=;k<=K;k++)
  96. ans=max(ans,dp[i][j][k]);
  97. printf("%lld\n",ans);
  98. }
  99. int main()
  100. {
  101. scanf("%d%d%d",&n,&m,&K);
  102. for(int i=;i<=n;i++)
  103. for(int j=;j<=m;j++)
  104. scanf("%lld",&a[i][j]);
  105. prepare();
  106. gao();
  107. return ;
  108. }
  109. /********************
  110.  
  111. ********************/

bzoj1084: [SCOI2005]最大子矩阵 dp的更多相关文章

  1. [bzoj1084][SCOI2005]最大子矩阵_动态规划_伪·轮廓线dp

    最大子矩阵 bzoj-1084 SCOI-2005 题目大意:给定一个n*m的矩阵,请你选出k个互不重叠的子矩阵使得它们的权值和最大. 注释:$1\le n \le 100$,$1\le m\le 2 ...

  2. BZOJ 1084: [SCOI2005]最大子矩阵 DP

    1084: [SCOI2005]最大子矩阵 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1084 Description 这里有一个n* ...

  3. bzoj千题计划198:bzoj1084: [SCOI2005]最大子矩阵

    http://www.lydsy.com/JudgeOnline/problem.php?id=1084 m=1: dp[i][j] 前i个数,选了j个矩阵的最大和 第i个不选:由dp[i-1][j] ...

  4. 洛谷P2331 [SCOI2005]最大子矩阵 DP

    P2331 [SCOI2005]最大子矩阵 题意 : 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 第一行为n,m,k(1≤n≤ ...

  5. [bzoj1084][SCOI2005]最大子矩阵(DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1084 分析: m=1时:相当于只有一行数,让你取出p段,使得总和最大 明显可以DP,f ...

  6. BZOJ1084 [SCOI2005]最大子矩阵 动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1084 题意概括 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注 ...

  7. bzoj1084: [SCOI2005]最大子矩阵

    dp.状态转移方程在代码里 #include<cstdio> #include<algorithm> #include<cstring> using namespa ...

  8. BZOJ1084 SCOI2005最大子矩阵

    考虑DP f[i][j][k]表示一行到i一行到j共取k块最大值,类似于最长公共子序列n^2那种 注意相等时可以一起拿 By:大奕哥 #include<bits/stdc++.h> usi ...

  9. bzoj1084 [SCOI2005]最大子矩阵——背包

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1084 水题...分类讨论一下即可. 代码如下: #include<iostream&g ...

随机推荐

  1. Python开发【项目】:生产环境下实时统计网站访问日志信息

    日志实时分析系统 生产环境下有需求:要每搁五分钟统计下这段时间内的网站访问量.UV.独立IP等信息,用直观的数据表格表现出来 环境描述: 网站为Nginx服务,系统每日凌晨会对日志进行分割,拷贝到其他 ...

  2. IDEA安装以及项目初始化

    首先安装idea: 如果15.0版本安装不上就安装16.0: 点击安装文件以后,一直点下一步就可以了. 安装完成后设置: 如果没有的话,需要点击SDKs,点击+,然后选择电脑上安装的JDK. 接下来创 ...

  3. centos Linux下磁盘管理 parted,df ,du,fdisk,partprobe,mkfs.ext4,mount,/etc/fstab,fsck,e2fsck,mk2efs,tmpfs ,nr_inodes, LVM,传统方式扩容文件系统 第七节课

    centos Linux下磁盘管理   parted,df ,du,fdisk,partprobe,mkfs.ext4,mount,/etc/fstab,fsck,e2fsck,mk2efs,tmpf ...

  4. SQL Server简洁查询正在运行SQL(等待事件)

    通常我们可以使用 sp_who2 我们希望更加简洁的信息,下面这个查询使用系统表sys.sysprocesses,以及sys.dm_exec_sql_text做OUTER APPLY. T-SQL是这 ...

  5. cocos-lua基础学习(10)scheduler类学习笔记

    local scheduler = cc.Director:getInstance():getScheduler() local function shouldNotCrash(dt) end loc ...

  6. 2.JVM运行机制 -- JVM序列

    上一次写了1.初步认识JVM -- JVM序列,今天接着记录写JVM的运行机制. 一.JVM启动流程 Java平台包括JVM以及Java语言,其中JVM也是运行在操作系统中的一个应用程序进程,那么也应 ...

  7. Linux 中的 Service

    参考: cnblogs.com/xiaofan21 - linux service和daemon cnblogs.com/xuange306 - linux service命令常见使用方法 cnblo ...

  8. ZOJ Monthly, January 2019

    A: Little Sub and Pascal's Triangle Solved. 题意: 求杨辉三角第n行奇数个数 思路: 薛聚聚说找规律,16说Lucas 答案是 $2^p \;\;p 为 n ...

  9. Python: 矩阵与线性代数运算

    需要执行矩阵和线性代数运算,比如矩阵乘法.寻找行列式.求解线性方程组等等. 矩阵类似于3.9 小节中数组对象,但是遵循线性代数的计算规则.下面的一个例子展示了矩阵的一些基本特性: >>&g ...

  10. 20145118 《Java程序设计》 实验报告一

    实验一 JAVA开发环境的熟悉(LINUX + ECLIPSE) 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 3.统计自己的P ...