P2331 [SCOI2005]最大子矩阵

题意 :

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

  第一行为n,m,k(1≤n≤100,1≤m≤2,1≤k≤10),接下来n行描述矩阵每行中的每个元素的分值(每个元素的分值的绝对值不超过32767)。

思路:

  注意这里的m只可能为1或者2.所以可以分开来考虑,对于m = 1,比较容易,dp[i][k] = dp[ t ][ k-1 ] + (t 到 i 的和)。然而对于m等于2的情况,我们可以开一个dp[ i ][ j ][ k ]. 表示第一行取前i个,第二行取前j个,取k个矩阵的最大值。那么就可以转移,当i!=j时,只可能是第一行的t推到 i 个,或者是第二行的t推到第 j 个,而当i == j时,还要考虑一个占两行的矩阵推移情况。

  1)子矩阵可以为空矩阵。

  2) 程序较大,容易写错下标,数组不要开小了。

  1. #include <algorithm>
  2. #include <iterator>
  3. #include <iostream>
  4. #include <cstring>
  5. #include <cstdlib>
  6. #include <iomanip>
  7. #include <bitset>
  8. #include <cctype>
  9. #include <cstdio>
  10. #include <string>
  11. #include <vector>
  12. #include <stack>
  13. #include <cmath>
  14. #include <queue>
  15. #include <list>
  16. #include <map>
  17. #include <set>
  18. #include <cassert>
  19.  
  20. using namespace std;
  21. #define lson (l , mid , rt << 1)
  22. #define rson (mid + 1 , r , rt << 1 | 1)
  23. #define debug(x) cerr << #x << " = " << x << "\n";
  24. #define pb push_back
  25. #define pq priority_queue
  26.  
  27. typedef long long ll;
  28. typedef unsigned long long ull;
  29. //typedef __int128 bll;
  30. typedef pair<ll ,ll > pll;
  31. typedef pair<int ,int > pii;
  32. typedef pair<int,pii> p3;
  33.  
  34. //priority_queue<int> q;//这是一个大根堆q
  35. //priority_queue<int,vector<int>,greater<int> >q;//这是一个小根堆q
  36. #define fi first
  37. #define se second
  38. //#define endl '\n'
  39.  
  40. #define OKC ios::sync_with_stdio(false);cin.tie(0)
  41. #define FT(A,B,C) for(int A=B;A <= C;++A) //用来压行
  42. #define REP(i , j , k) for(int i = j ; i < k ; ++i)
  43. #define max3(a,b,c) max(max(a,b), c);
  44. #define min3(a,b,c) min(min(a,b), c);
  45. //priority_queue<int ,vector<int>, greater<int> >que;
  46.  
  47. const ll mos = 0x7FFFFFFF; //
  48. const ll nmos = 0x80000000; //-2147483648
  49. const int inf = 0x3f3f3f3f;
  50. const ll inff = 0x3f3f3f3f3f3f3f3f; //
  51. const int mod = 1e8+;
  52. const double esp = 1e-;
  53. const double PI=acos(-1.0);
  54. const double PHI=0.61803399; //黄金分割点
  55. const double tPHI=0.38196601;
  56.  
  57. template<typename T>
  58. inline T read(T&x){
  59. x=;int f=;char ch=getchar();
  60. while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
  61. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  62. return x=f?-x:x;
  63. }
  64.  
  65. /*-----------------------showtime----------------------*/
  66.  
  67. const int maxn = ;
  68. int mp[maxn][];
  69. int dp[maxn][maxn][];
  70. int s[][maxn];
  71. int a[maxn][];
  72. int main(){
  73. int n,m,k;
  74. scanf("%d%d%d", &n, &m, &k);
  75. for(int i=; i<=n ;i++){
  76. for(int j=; j<=m ; j++)
  77. scanf("%d", &mp[i][j]);
  78. }
  79.  
  80. for(int i=; i<=m; i++){
  81. for(int j=; j<=n; j++){
  82. s[i][j] = s[i][j-] + mp[j][i];
  83. }
  84. }
  85.  
  86. if(m == ){
  87. int ans = ;
  88. for(int i=; i<=n; i++){
  89. for(int j=; j<=k; j++){
  90. a[i][j] = a[i-][j];
  91. for(int t=; t<i; t++)
  92. {
  93. a[i][j] = max(a[i][j], a[t][j-] + s[][i] - s[][t]);
  94. }
  95. ans = max(ans, a[i][j]);
  96. }
  97. }
  98. printf("%d", ans );
  99. }
  100. else {
  101. int ans = ;
  102. for(int i=; i<=n; i++){
  103. for(int j=; j<=n; j++){
  104. for(int t = ; t <= k; t++){
  105. dp[i][j][t] = max(dp[i-][j][t], dp[i][j-][t]);
  106. for(int q = ; q < i; q ++)
  107. dp[i][j][t] = max(dp[i][j][t], dp[q][j][t-] + s[][i] - s[][q]);
  108. for(int q = ; q < j; q ++)
  109. dp[i][j][t] = max(dp[i][j][t], dp[i][q][t-] + s[][j] - s[][q]);
  110.  
  111. if(i==j){
  112. for(int q=; q<i; q ++)
  113. dp[i][j][t] = max(dp[i][j][t], dp[q][q][t-] + s[][i] + s[][i] - s[][q] - s[][q]);
  114. }
  115. ans = max(ans, dp[i][j][t]);
  116. }
  117. }
  118. }
  119. printf("%d\n", ans);
  120. }
  121. return ;
  122. }

P2331

洛谷P2331 [SCOI2005]最大子矩阵 DP的更多相关文章

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

    洛谷 这一题,乍一眼看上去只想到了最暴力的暴力--大概\(n^4\)吧. 仔细看看数据范围,发现\(1 \leq m \leq 2\),这就好办了,分两类讨论. 我先打了\(m=1\)的情况,拿了30 ...

  2. 洛谷P2331 [SCOI2005] 最大子矩阵[序列DP]

    题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式: 第一行为n,m,k(1≤n≤100,1≤m≤2 ...

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

    题目 DP 此题可以分为两个子问题. \(m\)等于\(1\): 原题目转化为求一行数列里的\(k\)块区间的和,区间可以为空的值. 直接定义状态\(dp[i][t]\)表示前i个数分为t块的最大值. ...

  4. BZOJ1084或洛谷2331 [SCOI2005]最大子矩阵

    BZOJ原题链接 洛谷原题链接 注意该题的子矩阵可以是空矩阵,即可以不选,答案的下界为\(0\). 设\(f[i][j][k]\)表示前\(i\)行选择了\(j\)个子矩阵,选择的方式为\(k\)时的 ...

  5. bzoj1084&&洛谷2331[SCOI2005]最大子矩阵

    题解: 分类讨论 当m=1的时候,很简单的dp,这里就不再复述了 当m=2的时候,设dp[i][j][k]表示有k个子矩阵,第一列有i个,第二列有j个 然后枚举一下当前子矩阵,状态转移 代码: #in ...

  6. 洛谷 P1896 [SCOI2005]互不侵犯

    洛谷 P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8 ...

  7. 洛谷 P5279 - [ZJOI2019]麻将(dp 套 dp)

    洛谷题面传送门 一道 dp 套 dp 的 immortal tea 首先考虑如何判断一套牌是否已经胡牌了,考虑 \(dp\)​​​​​.我们考虑将所有牌按权值大小从大到小排成一列,那我们设 \(dp_ ...

  8. 【题解】洛谷P1896 [SCOI2005] 互不侵犯(状压DP)

    洛谷P1896:https://www.luogu.org/problemnew/show/P1896 前言 这是一道状压DP的经典题 原来已经做过了 但是快要NOIP 复习一波 关于一些位运算的知识 ...

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

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

随机推荐

  1. 【Android】未引入包问题

    Mac 上配置 Android 开发环境,遇到了下面问题: /Users/***/Documents/SVN/Android/***/1.0.3/res/values/styles.xml:21: e ...

  2. 有容云-【原理】Docker存储驱动之AUFS

    编者按:今天聊一聊Docker的Image(镜像)与Container(容器)的存储以及存储驱动之AUFS.   Docker存储驱动简介 Docker内置多种存储驱动,每种存储驱动都是基于Linux ...

  3. Office2019 VOL版本 自定义安装组件

    众所周知,Office VOL版本可以连接KMS服务器激活,但是office2019没有镜像可以下载,所以只能依靠Office Deployment Tool来进行操作.注:Office2019 Re ...

  4. Asp.NetCore源码学习[2-1]:配置[Configuration]

    Asp.NetCore源码学习[2-1]:配置[Configuration] 在Asp. NetCore中,配置系统支持不同的配置源(文件.环境变量等),虽然有多种的配置源,但是最终提供给系统使用的只 ...

  5. idea 新建不了servlet文件 方法(1)

    在pem.xml中添加较新版本的servletapi包 <dependency> <groupId>javax.servlet</groupId> <arti ...

  6. Draw.io

    如何给类图增加一个字段? 选中一个字段,然后按 Ctrl +Enter 即可. 参考:Add row to class diagram - stackoverflow

  7. 一文了解:Redis的AOF持久化

    Redis的AOF持久化 每当Redis-Server接收到写数据时,就把命令以文本形式追加到AOF文件里,当重启Redis服务时,AOF文件里的命令会被重新执行一次,重新恢复数据.当AOF过大时将重 ...

  8. map的实现和柯里化(Currying)

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/11329874.html 作者:窗户 ...

  9. Kaggle比赛(一)Titanic: Machine Learning from Disaster

    泰坦尼克号幸存预测是本小白接触的第一个Kaggle入门比赛,主要参考了以下两篇教程: https://www.cnblogs.com/star-zhao/p/9801196.html https:// ...

  10. spring-boot-plus V1.2.1 发布 文件上传下载和静态资源访问

    [V1.2.1-RELEASE] 2019.08.21 ⭐️ New Features 文件上传保存到服务器指定目录 文件下载 访问上传的图片等资源 启用项目静态资源访问,可访问static/temp ...