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] ...
随机推荐
- vue的基础数据绑定
todo https://www.jb51.net/article/132344.htm
- easyui tree 点击state=closed节点,每次重新加载数据
http://blog.csdn.net/lovejavaloveworld/article/details/30052305 树控件读取URL.子节点的加载依赖于父节点的状态.当展开一个封闭的节点, ...
- 我的 CSDN 博客目录索引(主要记录了我学习视频、书籍的笔记,持续更新中)
我的 CSDN 博客地址: lw_power的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/lw_power 佟刚老师<Spring4视频教程>学习笔记 ...
- linux系统基础优化及高级操作命令
Linux基础系统优化 引言没有,只有一张图. Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命令,在配置服务器基础环境时,先了解下网络参数设定命令. ifconfig 查询.设置网卡和 ...
- JavaScript 普通声明式函数
1.为什么需要函数 实现代码的复用.存在函数提升,且会在变量提升的上面; 2.函数的创建 js中函数语法: function 函数名(形参){ //函数体 } 调用时:函数名(形参) 注: (1) 形 ...
- LeetCode 300. 最长上升子序列(Longest Increasing Subsequence)
题目描述 给出一个无序的整形数组,找到最长上升子序列的长度. 例如, 给出 [10, 9, 2, 5, 3, 7, 101, 18], 最长的上升子序列是 [2, 3, 7, 101],因此它的长度是 ...
- spark streaming 2: DStream
DStream是类似于RDD概念,是对数据的抽象封装.它是一序列的RDD,事实上,它大部分的操作都是对RDD支持的操作的封装,不同的是,每次DStream都要遍历它内部所有的RDD执行这些操作.它可以 ...
- ffmpeg命令合流声卡和麦克风声音进行直播
ffmpeg -f dshow -i audio=:duration=first:dropout_transition= -f dshow -i video= -ac -f flv -y d:/tes ...
- SAP MaxDB日常运维—启动、关闭、磁盘扩容
SAP MaxDB日常维护1.检查MaxDB状态,并启动su - pe0csccd /sapdb/SDB/db/bin./dbmcli -d SDB -u superdba,Mypassword db ...
- leetcode 72. 编辑距离
/***** 定义状态: DP[i][j]其中i表示word1前i个字符,j表示Word2前i个字符 DP[i][j]表示单词1前i个字符匹配单词2前j个字符,最少变换次数: 状态转移: for i: ...