【BZOJ1084】【codevs2454】最大子矩阵,DP
2016-09-24 10:57
225 查看
传送门1
传送门2
思路:
我怎么这么煞笔啊……
有没有治疗脑残的药啊……
我一开始想的是考虑DP到第i行,已经有j个子矩阵
无果……
发现自己很纸张,然后加上0,1表示dp到左边还是右边
无果……
然后状态由0,1扩大到0,1,2表示用了左边,用了右边还是两边都用
无果……
唉……
想到了一点点两边一起DP,但已经是弃疗了
结果就是从早上七点开始想,写了2,3个DP都是60分。
后来翻题解(啪啪),瞄了一眼DP表示的状态
然后就写出来了
很显然m等于1的时候就是个普及难度O(n2)的k个字段和最大的DP
但是m=2时怎么办呢?
用f[i][j][l]表示有i个子矩阵,左边DP到第j行,右边DP到第k行
转移的话分别转移j,k就好,还有就是如果j=k时就可以两个一起转移
随便处理个前缀和就好
Md这题给学弟做都能A吧
复杂度O(n3k)
代码:
传送门2
思路:
我怎么这么煞笔啊……
有没有治疗脑残的药啊……
我一开始想的是考虑DP到第i行,已经有j个子矩阵
无果……
发现自己很纸张,然后加上0,1表示dp到左边还是右边
无果……
然后状态由0,1扩大到0,1,2表示用了左边,用了右边还是两边都用
无果……
唉……
想到了一点点两边一起DP,但已经是弃疗了
结果就是从早上七点开始想,写了2,3个DP都是60分。
后来翻题解(啪啪),瞄了一眼DP表示的状态
然后就写出来了
很显然m等于1的时候就是个普及难度O(n2)的k个字段和最大的DP
但是m=2时怎么办呢?
用f[i][j][l]表示有i个子矩阵,左边DP到第j行,右边DP到第k行
转移的话分别转移j,k就好,还有就是如果j=k时就可以两个一起转移
随便处理个前缀和就好
Md这题给学弟做都能A吧
复杂度O(n3k)
代码:
#include<cstdio> #include<iostream> using namespace std; int n,m,k; int a[103][3],sum[3][103],f[15][103][103]; main() { scanf("%d%d%d",&n,&m,&k); for (int i=1;i<=n;++i) for (int j=1;j<=m;++j) scanf("%d",a[i]+j); for (int i=1;i<=m;++i) for (int j=1;j<=n;++j) sum[i][j]=sum[i][j-1]+a[j][i]; for (int i=1;i<=k;++i) for (int j=1;j<=n;++j) for (int l=1;l<=n;++l) { f[i][j][l]=max(f[i][j][l-1],f[i][j-1][l]); for (int p=0;p<j;++p) f[i][j][l]=max(f[i][j][l],f[i-1][p][l]+sum[1][j]-sum[1][p]); for (int p=0;p<l;++p) f[i][j][l]=max(f[i][j][l],f[i-1][j][p]+sum[2][l]-sum[2][p]); if (j==l) for (int p=0;p<l;++p) f[i][j][l]=max(f[i][j][l],f[i-1][p][p]+sum[2][l]-sum[2][p]+sum[1][j]-sum[1][p]); } printf("%d",f[k] ); }
相关文章推荐
- android日常开发总结的技术经验60条
- Flip Game II
- HttpClient学习之三实现Basic认证
- 账号竟然被盗
- 详解HttpURLConnection(注意末尾的部分)
- iBatis简单入门教程。
- jQuery easyUI导入配置文件时,demo报错的修改方法(默认为Myeclipse)
- pyschools中的12hr To 24hr Time Conversion
- js dom对象:1.获取屏幕,可视范围大小
- Android studio导入eclipse项目找不到R文件
- 阻塞 非阻塞 同步 异步
- Maven使用基础
- php 模拟POST提交的2种方法
- linux中新建文件夹
- 今日头条2017校招笔试题
- 工具类http.java
- 小于N的质数
- MongoDB整合Spring详细讲解
- 基于window7+caffe实现图像艺术风格转换style-transfer
- Git 使用ssh密钥