博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[SCOI2005]最大子矩阵解题报告
阅读量:4047 次
发布时间:2019-05-25

本文共 1283 字,大约阅读时间需要 4 分钟。

[SCOI2005]最大子矩阵 解题报告

题目描述

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

输入输出格式

输入格式

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

输出格式:

只有一行为k个子矩阵分值之和最大为多少。

input

3 2 2

1 -3
2 3
-2 3

output

9

思路:

显然这道题是一道与矩阵有关的DP

所以可以用一种叫 悬线法 的奇技淫巧
所谓悬线法就是先把每一行,每一列的状态都给拓展出来,然后再变为矩阵进行合并

先求出前缀和,方便转移。

然后就是转移了。

wait!!

有没有注意到m<=2??

当m=1时,很简单。。

f[i][k]=max(f[i][k],f[j][k-1]+sum[1][i]-sum[1][j]);//代表在前i个数中//分成k个所取得的最大值

当m=2时

就要用悬线法啦!!
F[i][j][k]代表在第一行取i个,第二行取个,分成k个的最大值。
什么都不做
先拓展第一行
然后第二行
最后合并

for(int k=1;k<=K;k++)            for(int i=1;i<=n;i++)                for(int j=1;j<=n;j++)                {
F[i][j][k]=max(F[i-1][j][k],F[i][j-1][k]);//不在这一个点取数 for(int l=0;l

应该都懂了吧??

完整代码

#include
using namespace std;#define maxn 105#define INF 0x3f3f3fint n,m,K,x;int f[maxn][maxn];int F[maxn][maxn][maxn];int sum[4][maxn];int main(){
scanf("%d%d%d",&n,&m,&K); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&x),sum[j][i]=sum[j][i-1]+x;//前缀和 if(m==1) {
//memset(f,-INF,sizeof(f)); for(int k=1;k<=K;k++) for(int i=1;i<=n;i++) {
f[i][k]=f[i-1][k]; for(int j=0;j

祝各位dalao成功AC!!!

最后安利一波dalao的博客

转载地址:http://wyuci.baihongyu.com/

你可能感兴趣的文章
QT打开项目提示no valid settings file could be found
查看>>
Win10+VS+ESP32环境搭建
查看>>
Ubuntu+win10远程桌面
查看>>
flutter-实现圆角带边框的view(android无效)
查看>>
android 代码实现圆角
查看>>
flutter-解析json
查看>>
android中shader的使用
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
drat中构造方法
查看>>
JavaScript的一些基础-数据类型
查看>>
JavaScript基础知识(2)
查看>>
转载一个webview开车指南以及实际项目中的使用
查看>>
android中对于非属性动画的整理
查看>>
一个简单的TabLayout的使用
查看>>
ReactNative使用Redux例子
查看>>
Promise的基本使用
查看>>
coursesa课程 Python 3 programming 统计文件有多少单词
查看>>
coursesa课程 Python 3 programming 输出每一行句子的第三个单词
查看>>
Returning a value from a function
查看>>
coursesa课程 Python 3 programming Functions can call other functions 函数调用另一个函数
查看>>