传送门

就是个普及组 $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. idea maven projects 工具栏按钮的作用

    1.Execute Maven Goal  弹出可执行的 Maven 命令的输入框.有些情况下我们需要通过书写某些执行命令来构建项目,就可以通过此按钮 2.Toggle Offline Mode 英文 ...

  2. [Pytorch笔记] scatter_

    https://blog.csdn.net/qq_16234613/article/details/79827006 scatter_(input, dim, index, src)将src中数据根据 ...

  3. python学习之路(13)

    列表生成式 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, ...

  4. [CSP-S模拟测试]:笨小猴(随机化)

    题目传送门(内部题118) 输入格式 输入第一行是一个整数$n$,意义如以上所示. 接下来有$2n+1$行,每行为两个正整数,第$i$行的两个正整数分别代表$A_i$和$B_i$. 输出格式 如果无法 ...

  5. Java并发编程的艺术笔记(九)——FutureTask详解

    FutureTask是一种可以取消的异步的计算任务.它的计算是通过Callable实现的,多用于耗时的计算. 一.FutureTask的三种状态 二.get()和cancel()执行示意 三.使用 一 ...

  6. C++入门经典-例6.10-将多维数组转换成一维数组

    1:代码如下: // 6.10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> usin ...

  7. C++入门经典-例6.1-一维数组元素

    1:代码如下: // 6.1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...

  8. The control collection cannot be modified during DataBind, Init, Load, PreRender or Unload phases.

    https://stackoverflow.com/questions/5508666/dynamically-add-html-to-asp-net-page https://stackoverfl ...

  9. Gson解析list类型的json串

    Gson gson = new Gson(); Type type = new TypeToken<List<Object>>() {}.getType(); List< ...

  10. T84341 Jelly的难题1

    T84341 Jelly的难题1 题解 当窝发现窝的锅在读入这个矩阵的时候,窝..窝..窝.. 果然,一遇到和字符串有关的题就开始吹空调 好啦我们说说思路吧 BFS队列实现 拿出一个没有走过的点,扩展 ...