传送门

就是个普及组 $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. VS Code 最好用的 Markdown 插件

    对经常使用 Markdown 写东西的工程师来说找到称手好用的 Markdown 编辑器非常重要. 目前为止 VS Code 最好用的插件是 Markdown Preview Enhanced . 各 ...

  2. jQuery_替换操作

    代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...

  3. python学习之路(9)

    函数的参数 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调 ...

  4. char和vachar的字段长度怎么影响数据库的性能的

    1.限制规则 字段的限制在字段定义的时候有以下规则: a)                  存储限制 varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度 ...

  5. H5视频活动踩坑

    最近做了一些嵌入视频的活动,积累了点视频方面的经验,下面记录下别人和自己踩过的坑以及相应的解决方案.1.碰到问题和解决方案1.1.ios 网页中播放视频默认全屏(点击视频会弹出播放器进行全屏播放).解 ...

  6. AOI 设计

    http://blog.csdn.net/zhanghefu/article/details/25833535 云风的Blog 并进行整理而写. AOI(Area Of Interest),中文就是感 ...

  7. 【nginx】 配置域名转发到相同地址不同端口下执行相应业务

    #doctor upstream doc { server 52.**.**.***:8090; } #patient upstream pat { server 52.**.**.***:8088; ...

  8. readyState xhr对象当前状态

    var request=new XMLHttpRequest(); request.open("GET","get.php",true); request.se ...

  9. 选题 Scrum立会报告+燃尽图 01

    此作业要求参见[https://edu.cnblogs.com/campus/nenu/2019fall/homework/8683] 一.小组介绍 组长:贺敬文 组员:彭思雨 王志文 位军营 杨萍 ...

  10. 在控制台程序中,添加config文件

    一.右击类库 → 添加 → 新建项 → 应用程序配置文件(或者选择一个XML文件,然后将名字改成XXX.config),内容如下: <?xml version="1.0" e ...