P1398 [NOI2013]书法家
就是个普及组 $dp$ 合集,把 $NOI$ 从左到右拆成 $9$ 个部分,每个部分都可以分别 $dp$
除了 $N$ 的中间部分比较恶心以外其他都还好,自己推一下然后就知道转移,就 $N$ 的中间优化转移比较不好写
随便吧,反正 $9$ 个 $dp$ 都挺简单的,量变导致质变,我在想那一年的选手是不是都被恶心到了...反正我是被恶心死了
$luogu$ 上这一题空间限制太小了,原题是 $512MB$ ,所以这份代码在 $luogu$ 过不去(我都滚动数组了啊...)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=,M=;
int n,m,sum[N][M],ans;
int f[][M][N][N],mx[M][N][N],mxx,mxxx[N][N];
inline int calc(int x,int l,int r) { return sum[r][x]-sum[r][x-]-sum[l-][x]+sum[l-][x-]; }
int main()
{
n=read(),m=read();
for(int i=;i<=n;i++)
for(int j=;j<=m;j++) sum[i][j]=sum[i-][j]+sum[i][j-]-sum[i-][j-]+read();
memset(f,~0x3f,sizeof(f)); memset(mx,~0x3f,sizeof(mx));
for(int j=;j<=n;j++)
for(int k=j;k<=n;k++) f[][][j][k]=;
for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
for(int k=j;k<=n;k++)
f[][i][j][k]=max(,f[][i-][j][k])+calc(i,j,k);
for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
for(int k=n-;k>=j;k--)
mx[i][j][k]=max(mx[i][j][k+],f[][i-][j][k+]);
for(int i=;i<=m;i++)
{
memset(mxxx,~0x3f,sizeof(mxxx));
for(int k=n;k>=;k--)
for(int j=;j<=k;j++) mxxx[j][k]=max(mxxx[j-][k],f[][i-][j][k]);
for(int j=;j<=n;j++)
{
mxx=mxxx[j-][j-];
for(int k=j;k<=n;k++)
{
mxx=max(mxx,mxxx[j][k]);
f[][i][j][k]=max(mx[i][j][k],mxx)+calc(i,j,k);
}
}
}
memset(mx,~0x3f,sizeof(mx)); memset(f[],~0x3f,sizeof(f[]));
for(int i=;i<=m;i++)
for(int k=;k<=n;k++)
for(int j=k-;j>=;j--)
mx[i][j][k]=max(mx[i][j+][k],f[][i-][j+][k]);
for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
for(int k=j;k<=n;k++)
f[][i][j][k]=max(mx[i][j][k],f[][i-][j][k])+calc(i,j,k);
mxx=f[][][][]; memset(f[],~0x3f,sizeof(f[]));
for(int i=;i<=m;i++)
{
for(int j=;j<=n;j++)
for(int k=j+;k<=n;k++)
f[][i][j][k]=mxx+calc(i,j,k);
for(int j=;j<=n;j++)
for(int k=j;k<=n;k++)
mxx=max(mxx,f[][i-][j][k]);
}
memset(f[],~0x3f,sizeof(f[]));
for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
for(int k=j+;k<=n;k++)
f[][i][j][k]=max(f[][i-][j][k],f[][i-][j][k])+calc(i,j,k)-calc(i,j+,k-);
memset(f[],~0x3f,sizeof(f[]));
for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
for(int k=j+;k<=n;k++)
f[][i][j][k]=f[][i-][j][k]+calc(i,j,k);
mxx=f[][][][]; memset(f[],~0x3f,sizeof(f[]));
for(int i=;i<=m;i++)
{
for(int j=;j<=n;j++)
for(int k=j+;k<=n;k++)
f[][i][j][k]=max(mxx,f[][i-][j][k])+calc(i,j,k)-calc(i,j+,k-);
for(int j=;j<=n;j++)
for(int k=j;k<=n;k++)
mxx=max(mxx,f[][i-][j][k]);
}
memset(f[],~0x3f,sizeof(f[]));
for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
for(int k=j+;k<=n;k++)
f[][i][j][k]=max(f[][i-][j][k],f[][i-][j][k])+calc(i,j,k);
ans=f[][][][]; memset(f[],~0x3f,sizeof(f[]));
for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
for(int k=j+;k<=n;k++)
{
f[][i][j][k]=max(f[][i-][j][k],f[][i-][j][k])+calc(i,j,k)-calc(i,j+,k-);
ans=max(ans,f[][i][j][k]);
}
printf("%d\n",ans);
return ;
}
P1398 [NOI2013]书法家的更多相关文章
- luogu P1398 [NOI2013]书法家
传送门 注意到\(N\ O\ I\)三个字母都可以从左到右拆成三部分,即\(N=\)一个矩形+一堆矩形+一个矩形,\(O=\)一条+两条横的+一条,\(I=\)两条横的+一个矩形+两条横的,所以可以拆 ...
- [Noi2013]书法家
来自FallDream的博客,未经允许,请勿转载,谢谢. 小E同学非常喜欢书法,他听说NOI2013已经开始了,想题一幅“NOI”的字送给大家. 小E有一张非常神奇的纸,纸可以用一个n 行m 列的二维 ...
- BZOJ3241/UOJ125 [Noi2013]书法家
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- BZOJ 3241: [Noi2013]书法家
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3241 题意: 思路:把每个字母分成三部分,两个字母之间还有空的列,所以我一共设了11个状态 ...
- 【uoj125】 NOI2013—书法家
http://uoj.ac/problem/125 (题目链接) 题意 在网格上写“NOI”,每个格子上有一些权值,要求覆盖的权值最大.书写有一些规则. Solution 将“NOI”分成11个部分, ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- NOI2013 Day2
NOI2013 Day2 矩阵游戏 题目描述:设矩阵\(F\) 求\(F[n][m](mod (10^9+7))\) solution: 这题可以求通项解决. 设\(X_i=F[i][m]\), \( ...
- bzoj 3242: [Noi2013]快餐店 章鱼图
3242: [Noi2013]快餐店 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 266 Solved: 140[Submit][Status] ...
- bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化
3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 613 Solved: 256[Submit][Status] ...
随机推荐
- R_Studio(贷款)数据规范化处理[最小-最大规范化、零-均值规范化、小数定标规范化]
农场申请贷款.csv 对“农场申请贷款.csv”中农场大小.降雨量.农场质量.农场收入进行数据规范化处理 行数[4 5 6 7] “农场申请贷款.csv”中存在缺失值,已对数据进行预处理 setwd( ...
- XSS这段时间的学习总结
0X01利用平台payload获取COOKIE 本机IP 192.168.1.100 靶机win7 192.168.1.102 我们先创建一个cookie的项目 然后在可以执行xss的地方插入我们的恶 ...
- LeetCode 74. 搜索二维矩阵(Search a 2D Matrix)
题目描述 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 1: 输入: ma ...
- XMLHttpRequest 对象属性参数参考
readyState:提供当前 HTML 的就绪状态. readyState可能返回的值: 0:请求未初始化(还没有调用 open()). 1:请求已经建立,但是还没有发送(还没有调用 send()) ...
- 一、基础篇--1.1Java基础-Session和Cookie的区别【转】
https://www.cnblogs.com/zlw-xf/p/8001383.html 1:cookie数据存放在客户的浏览器上(客户端),session数据放 @1:cookie不是很安全,别人 ...
- win2003 64位系统IIS配置方法
IIS7 很简单,在网站对应的应用程序池上右键高级设置,常规里的启用32位应用程序改为true就可以了,IIS6稍微复杂一些, 1,命令行里运行 cscript.exe %SYSTEMDRIVE%\i ...
- SpringBoot通过@Value获取application.yml配置文件的属性值
application.yml实例: spring: redis: database: 0 host: 127.0.0.1 获取方法: /** * @Auther:WangZiBin * @Descr ...
- P1200 [USACO1.1]你的飞碟在这儿Your Ride Is He…
P1200 [USACO1.1]你的飞碟在这儿Your Ride Is He… 大写祖母转数字 -64 发现dalao #include<bits/stdc++.h> usi ...
- Linux_Ubuntu命令概述
1.命令使用方法 Linux命令格式: command [-options] [parameter1] … 说明: command: 命令名,相应功能的英文单词或单词的缩写 [-options]:选项 ...
- linux(centOS7)的基本操作(五) 磁盘、分区、挂载、卸载
linux的磁盘类型和分区简介 linux的磁盘分为IDE和SCSI,目前以后者居多. 1. IDE磁盘的分区:hd+盘号+分区数字 盘号 |-a:基本盘 |-b:基本从属盘 |-c:辅助主盘 |-d ...