题目描述

小 E 同学非常喜欢书法,他听说 NOI2013 已经开始了,想题一幅 “NOI” 的字送给大家。

小 E 有一张非常神奇的纸,纸可以用一个 n 行 m 列的二维方格矩阵来表示,为了描述方便,我们定义矩阵左下角方格坐标为 (1,1),右上角方格坐标为 (m,n)。

矩阵的每个方格有一个整数的幸运值。在格子上面写字可以增加大家的幸运度,幸运度的大小恰好是所有被笔写到的方格的幸运值之和。现在你要在上面写上 “N”, “O”, “I” 三个字母。

下面给出 3 个书法字的定义:

  1. “N” 由若干 (≥3) 个边平行于坐标轴的矩形组成,设由 K 个矩形组成(标号 1∼K),第 i 个矩形的左下角方格坐标设为 (Li,Bi),右上角坐标设为 (Ri,Ti),要求满足:

    • Li≤Ri,Bi≤Ti
    • 对任意 1<i≤K,有 Li=Ri−1+1
    • 对任意 3≤i<K,有 Bi−1−1≤Ti≤Ti−1,Bi≤Bi−1
    • B2>B1,T2=T1,BK−1=BK,TK−1<TK
  2. “O” 由一个大矩形 A,挖去一个小矩形 B 得到,这两个矩形的边都平行于坐标轴。设大矩形 A 左下角的方格坐标为 (u,v),长为 W,宽为 H,则小矩形 B 满足左下角方格坐标为 (u+1,v+1),长 W−2,宽 H−2。要求满足:
    • W≥3,H≥3
    • u>RK+1
  3. “I” 为 3 个边平行于坐标轴的从下到上的实心矩形组成,从下到上依次标号为 1,2,3,第 i 个矩形的左下角格子坐标设为 (Pi,Qi),右上角格子坐标设为 (Gi,Hi),要求满足:
    • Pi≤Gi,Qi≤Hi
    • P1=P3>u+W,G1=G3
    • Q1=H1=Q2−1,H2+1=Q3=H3
    • P1<P2≤G2<G1

下图是一个 “N”,“O”,“I” 的例子。

另外,所有画的图形均不允许超过纸张的边界。现在小 E 想要知道,他能画出的最大幸运度是多少。

输入格式

第一行包含两个正整数 n 和 m,分别表示矩阵的行数和列数。

接下来 n 行,每行有 m 个整数,第 i+1 行的第 j 个数表示格子 (j, n − i + 1)(j,n−i+1) 的幸运值。

输出格式

输出一个整数 T,表示小 E 能够获得的最大幸运度。

样例一

input

3 13
1 1 -1 -1 1 -1 1 1 1 -1 1 1 1
1 -1 1 -1 1 -1 1 -1 1 -1 -1 1 -1
1 -1 -1 1 1 -1 1 1 1 -1 1 1 1

output

24

样例二

input

3 13
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

output

-20

样例三

见样例数据下载。

限制与约定

测试点编号 n m 幸运值范围
1 =3 =12 [−50,50]
2
3
4
5 ≤10 ≤20 [−50,50]
6
7
8
9 ≤150 ≤500 =1
10
11 ≤80 ≤80 [−200,200]
12
13
14
15 ≤150 ≤500 [−200,200]
16
17
18
19
20

对于所有的测试数据,保证 n≥3,m≥12。

时间限制:2s

空间限制:512MB

分析

很自然地分成9个部分进行动态规划,即把NOI3个字母,每个字母分别从左到右分为3部分,然后逐列进行转移。
除了N的第二部分其余的都很好转移,具体怎么转移的呢?其实也就是按照他的规则进行模拟,看代码就能理解了。

代码

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define MAXN 150
#define MAXM 500
#define INF 0x3fffffff
int a[MAXN+10][MAXM+10],n,m,blk[MAXM+10][2],f[2][10][MAXN+10][MAXN+10],s[MAXN+10][MAXM+10],tmp[MAXN+10][MAXN+10],ans=-INF;
void Read(int &x){static char c;bool f(0);while(c=getchar(),c!=EOF){if(c=='-')f=1;else if(c>='0'&&c<='9'){x=c-'0';while(c=getchar(),c>='0'&&c<='9')x=x*10+c-'0';ungetc(c,stdin);if(f)x=-x;return;}}
}
void read(){Read(n),Read(m);int i,j;for(i=1;i<=n;i++)for(j=1;j<=m;j++){Read(a[i][j]);s[i][j]=s[i-1][j]+a[i][j];}
}
void dp(){int i,j,k;memset(f[1],0xb0,sizeof f[1]);for(i=1;i<=n;i++)for(j=i;j<=n;j++)f[1][1][i][j]=s[j][1]-s[i-1][1];blk[1][0]=blk[1][1]=-INF;for(k=2;k<=m;k++){memset(f[k&1],0xb0,sizeof f[k&1]);//N的第一部分for(i=1;i<=n;i++)for(j=i;j<=n;j++)f[k&1][1][i][j]=max(s[j][k]-s[i-1][k],f[(k&1)^1][1][i][j]+s[j][k]-s[i-1][k]);//N的第二部分for(i=1;i<=n;i++){tmp[i][n+1]=-INF;for(j=n;j>=i;j--)tmp[i][j]=max(tmp[i][j+1],f[(k&1)^1][1][i][j]);}for(i=1;i<=n;i++)for(j=i;j<=n;j++){f[k&1][2][i][j]=max(f[k&1][2][i][j],tmp[i][j+1]+s[j][k]-s[i-1][k]);tmp[i][j]=-INF;}for(i=1;i<=n;i++)for(j=i;j<=n;j++)tmp[j+1][j+1]=max(tmp[j+1][j+1],f[(k&1)^1][2][i][j]);for(i=1;i<=n;i++)for(j=i+1;j<=n;j++)tmp[i][j]=max(tmp[i][j],tmp[i][j-1]);for(i=1;i<=n;i++)for(j=i;j<=n;j++)f[k&1][2][i][j]=max(f[k&1][2][i][j],tmp[i][j]+s[j][k]-s[i-1][k]);for(i=1;i<=n;i++)for(j=i;j<=n;j++)tmp[i][j]=f[(k&1)^1][2][i][j];for(j=1;j<=n;j++)for(i=1;i<j;i++)tmp[i+1][j]=max(tmp[i+1][j],tmp[i][j]);for(i=1;i<=n;i++)for(j=i;j<n;j++)tmp[i][j+1]=max(tmp[i][j+1],tmp[i][j]);for(i=1;i<=n;i++)for(j=i;j<=n;j++)f[k&1][2][i][j]=max(f[k&1][2][i][j],tmp[i][j]+s[j][k]-s[i-1][k]);//N的第三部分for(i=1;i<=n;i++)for(j=i;j<=n;j++)tmp[i][j]=f[(k&1)^1][2][i][j];for(j=1;j<=n;j++)for(i=j;i>1;i--)tmp[i-1][j]=max(tmp[i-1][j],tmp[i][j]);for(i=1;i<=n;i++)for(j=i+1;j<=n;j++)f[k&1][3][i][j]=max(f[k&1][3][i][j],max(tmp[i+1][j],f[(k&1)^1][3][i][j])+s[j][k]-s[i-1][k]);//NO之间空白blk[k][0]=blk[k-1][0];for(i=1;i<=n;i++)for(j=i;j<=n;j++)blk[k][0]=max(blk[k][0],f[(k&1)^1][3][i][j]);//O的第一部分for(i=1;i<=n;i++)for(j=i+2;j<=n;j++)f[k&1][4][i][j]=blk[k-1][0]+s[j][k]-s[i-1][k];//O的第二部分for(i=1;i<=n;i++)for(j=i+2;j<=n;j++)f[k&1][5][i][j]=max(f[(k&1)^1][4][i][j],f[(k&1)^1][5][i][j])+a[i][k]+a[j][k];//O的第三部分for(i=1;i<=n;i++)for(j=i+2;j<=n;j++)f[k&1][6][i][j]=f[(k&1)^1][5][i][j]+s[j][k]-s[i-1][k];//OI之间空白blk[k][1]=blk[k-1][1];for(i=1;i<=n;i++)for(j=i;j<=n;j++)blk[k][1]=max(blk[k][1],f[(k&1)^1][6][i][j]);//I的第一部分for(i=1;i<=n;i++)for(j=i+2;j<=n;j++)f[k&1][7][i][j]=max(blk[k-1][1],f[(k&1)^1][7][i][j])+a[i][k]+a[j][k];//I的第二部分for(i=1;i<=n;i++)for(j=i+2;j<=n;j++)f[k&1][8][i][j]=max(f[(k&1)^1][7][i][j],f[(k&1)^1][8][i][j])+s[j][k]-s[i-1][k];//I的第三部分for(i=1;i<=n;i++)for(j=i+2;j<=n;j++){f[k&1][9][i][j]=max(f[(k&1)^1][8][i][j],f[(k&1)^1][9][i][j])+a[i][k]+a[j][k];ans=max(ans,f[k&1][9][i][j]);}   }
}
int main()
{read();dp();printf("%d\n",ans);
}

转载于:https://www.cnblogs.com/outerform/p/5921818.html

【DP】[NOI2013]书法家相关推荐

  1. BZOJ 3241: [Noi2013]书法家

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

  2. [颓废史]蒟蒻的刷题记录

    QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...

  3. NOI2013 快餐店

    NOI2013 快餐店 Description 小T打算在城市C开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近的地方 ...

  4. dp,sp,px相互转化

    方法一: public int sp2px(float sp) {return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, ...

  5. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  6. HDU 2084 数塔(DP)(JAVA版)

    数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  7. dp cf 20190615

    A. Timofey and a tree 这个不算是dp,就是一个思维题,好难想的思维题,看了题解才写出来的, 把点和边分开,如果一条边的两个点颜色不同就是特殊边,特殊边两边连的点就叫特殊点, 如果 ...

  8. BZOJ 1003[ZJOI2006]物流运输(SPFA+DP)

    Problem 1003. -- [ZJOI2006]物流运输 1003: [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MB Submit ...

  9. [NOI2005]聪聪与可可(期望dp)

    题意:给一张无向图,有一只猫和一只老鼠,猫每秒会向老鼠的方向移动两个单位,若它们的距离为一,那么只会移动一个单位,老鼠会等概率向周围移动一步或不动,求猫抓到老鼠的期望时间. Solution luog ...

最新文章

  1. 【控制】《多智能体系统的动力学分析与设计》徐光辉老师-第3章-采样环境下带有领航者的二阶多智能体系统的一致性
  2. 惠普电脑怎么截屏_惠普(HP)暗影精灵6游戏台式电脑主机怎么样?配置和使用体验测评-最新资讯...
  3. 内窥镜去反光的论文整理
  4. C++ static、const和static const类型成员变量声明及其初始化
  5. Mysql 设置问题,当使用一些开源的软件动态安装MYSQL数据库后,发现里面的中文全是乱码。...
  6. html如何动态添加样式表,JavaScript动态插入CSS的方法
  7. Linux CentOS 7安装Oracle11g超完美教程
  8. 用MFC实现WebGUI--(CDHtmlDialog)
  9. android 短信超链接,Android处理网页的短信链接
  10. 已解决SyntaxError: Non-UTF-8 code starting with ‘\xe8‘ in file
  11. Oracle实现递归查询
  12. 攻防世界 MISC新手练习区 刷12道题题所得的思路和方法
  13. CSGO手套武器箱直接卖还是开了再卖?
  14. c语言 字符串转换中文乱码,怎么将unicode转中文字符编码存在文本中
  15. Android studio 之 高级调试技巧,看这一篇够啦
  16. R语言用泊松Poisson回归、GAM样条曲线模型预测骑自行车者的数量
  17. 光放接头形式 SC/APC; SC/PC
  18. js清除所有的cookie
  19. 变频器开关电源电路实例
  20. 第十八届全国大学生智能车竞赛赛道说明

热门文章

  1. 圆形led屏幕_一种圆形LED显示屏幕的制作方法
  2. ps怎么一下选中多个图层_超实用!50个非常实用的PS快捷键命令大全分享
  3. python错误修复_如何修复python错误(对象不可调用)
  4. echarts 堆叠柱状图3d效果_【python可视化】:pyecharts:柱形图、堆叠条形图、极坐标堆叠柱形图、极坐标堆叠分类条形图...
  5. 物联网技术概论的课程编号_选课推荐 | 第5期:物联网技术概论
  6. iphone7配置_西安苹果售后维修教您iphone7发热严重、耗电快怎么解决?
  7. 简易无接触温度测量与身份识别装置【2020年大学生电子设计竞赛F题】
  8. 【火爆全网,好评如潮】DS100手持示波器现货发售拉,附原子哥发布会详细讲解视频以及宣传视频...
  9. 你还会写这段C51程序吗?
  10. java bitset 扩展_将java BitSet保存到DB