传送门

就是个普及组 $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]书法家的更多相关文章

  1. luogu P1398 [NOI2013]书法家

    传送门 注意到\(N\ O\ I\)三个字母都可以从左到右拆成三部分,即\(N=\)一个矩形+一堆矩形+一个矩形,\(O=\)一条+两条横的+一条,\(I=\)两条横的+一个矩形+两条横的,所以可以拆 ...

  2. [Noi2013]书法家

    来自FallDream的博客,未经允许,请勿转载,谢谢. 小E同学非常喜欢书法,他听说NOI2013已经开始了,想题一幅“NOI”的字送给大家. 小E有一张非常神奇的纸,纸可以用一个n 行m 列的二维 ...

  3. BZOJ3241/UOJ125 [Noi2013]书法家

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  4. BZOJ 3241: [Noi2013]书法家

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3241 题意: 思路:把每个字母分成三部分,两个字母之间还有空的列,所以我一共设了11个状态 ...

  5. 【uoj125】 NOI2013—书法家

    http://uoj.ac/problem/125 (题目链接) 题意 在网格上写“NOI”,每个格子上有一些权值,要求覆盖的权值最大.书写有一些规则. Solution 将“NOI”分成11个部分, ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. NOI2013 Day2

    NOI2013 Day2 矩阵游戏 题目描述:设矩阵\(F\) 求\(F[n][m](mod (10^9+7))\) solution: 这题可以求通项解决. 设\(X_i=F[i][m]\), \( ...

  8. bzoj 3242: [Noi2013]快餐店 章鱼图

    3242: [Noi2013]快餐店 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 266  Solved: 140[Submit][Status] ...

  9. bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 613  Solved: 256[Submit][Status] ...

随机推荐

  1. 获取select的option值

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  2. 20175215 2018-2019-2 第八周java课程学习总结

    第十五章 泛型与几何框架 15.1 泛型 泛型(Generics)是在JDK1.5中推出的,其主要目的是可以建立具有类型安全的集合框架,如链表.散列映射等数据结构. 15.1.1 泛型类声明 可以使用 ...

  3. Swagger常用参数用法

    别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/m ...

  4. nginx-location正则表达式匹配规则及动静分离

    nginx-location正则表达式匹配规则及动静分离  发表于 2018年03月5日 |  分类于 nginx|  0 nginx,location常用正则表达式,及nginx动静分离 nginx ...

  5. 利用docker启动 wordpress

    网上有很多教程哈,我只是记录自己怎么玩的,没啥教学意义 查看镜像说明的mysql/data目录,方便挂载 [root@docker ~]# docker inspect -f {{.Config.Vo ...

  6. 1. 参数的传入和添加 argparse.ArgumentParser()

    # Edit configuration 传入的参数使用的是--file_dir picture, 获取使用的是argv.file_dir import argparse, sys def parse ...

  7. 浏览器端-W3School-JavaScript-HTML DOM:HTML DOM Attribute 对象

      ylbtech-浏览器端-W3School-JavaScript-HTML DOM:HTML DOM Attribute 对象 1.返回顶部 1. HTML DOM Attribute 对象 HT ...

  8. Activity 的状态都有哪些?

    a) foreground activityb) visible activityc) background activityd) empty process

  9. 三十六:数据库之SQLAlchemy外建之一对一关系

    relationship()的uselist参数默认为True,即一对多,如果要一对一,则需让uselist=False 准备工作 from sqlalchemy import create_engi ...

  10. Jmeter之乱码 (三)

    使用Jmeter执行JDBC请求,往MySQL数据库中插入数据,如下图: 执行结果如下: 解决方案: 在JDBC Connection Configuration中的Database URL后加上&a ...