题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3241

题意:

思路:把每个字母分成三部分,两个字母之间还有空的列,所以我一共设了11个状态f[11][i][j],123表示字母N,4表示NO之间的空列,567表示O,8表示OI之间的空列,9 10 11表示I。然后按照列DP.f[t][i][j]表示状态t,最上最下的位置[i,j]的最大价值。那么我们看转移:

1:直接生成或者从1转移过来

2:从1或者2转移过来

3:从2或者3转移过来

4:从3或者4转移过来

5:从4转移过来

6:从5或者6转移过来

7:从6转移过来

8:从7转移过来

9:从8或者9转移过来

10:从9或者10转移过来

11:从10或者11转移过来 并且这个状态可以更新答案

最麻烦的是从2状态向2状态转移。我们这里用我们正常的坐标,左上角为(1,1)。设转移为(2,k,t)->(2,i,j),其中k<=i<=t+1,j>=t。我们将这个分成两种情况:

(1)i=t+1:设dp[t+1][t+1]=max(f[2][1][t],f[2][2][t],……,f[][2][t-1][t],f[2][t][t])。最后用dp[i][j]更新dp[i][j+1],那么直接用dp[i][j]更新当前的f[2][i][j];

(2)k<=i<=t:比如k=2,t=6,那么这个可以更新

[2,6],[2,7],……,[2,n]

[3,6],[3,7],……,[3,m]

……

[6,6],[6,7],……,[6,n]

因此设dp[i][j]=f[2][i][j],之后用dp[i][j]更新dp[i+1][j],最后再用dp[i][j]更新dp[i][j+1]即可。这两个更新的顺序不能反。

int f[2][12][155][155];
int n,m,a[155][555];int col;int S(int i,int j)
{return a[j][col]-a[i-1][col];
}void upMax(int &x,int y)
{if(x<y) x=y;
}int dp[155][155];void clear(int t)
{int i,j,k;for(i=1;i<12;i++) for(j=0;j<=n+1;j++) for(k=0;k<=n+1;k++) f[t][i][j][k]=-INF;
}int main()
{n=getInt();m=getInt();int i,j,k;for(i=1;i<=n;i++){for(j=1;j<=m;j++) a[i][j]=getInt()+a[i-1][j];}col=1;int pre=0,cur=1;clear(pre);for(i=1;i<=n;i++) for(j=i;j<=n;j++){f[0][1][i][j]=S(i,j);}int ans=-INF;for(col=2;col<=m;col++){clear(cur);//1for(i=1;i<=n;i++) for(j=i;j<=n;j++){upMax(f[cur][1][i][j],f[pre][1][i][j]+S(i,j));upMax(f[cur][1][i][j],S(i,j));}//2for(i=1;i<=n;i++){dp[i][n+1]=-INF;for(j=n;j>=i;j--) dp[i][j]=max(dp[i][j+1],f[pre][1][i][j]);}for(i=1;i<=n;i++) for(j=i;j<=n;j++){upMax(f[cur][2][i][j],dp[i][j+1]+S(i,j));}for(i=1;i<=n;i++) for(j=i;j<=n;j++) dp[i][j]=-INF;for(i=1;i<=n;i++) for(j=i;j<=n;j++) upMax(dp[j+1][j+1],f[pre][2][i][j]);for(i=1;i<=n;i++) for(j=i+1;j<=n;j++) upMax(dp[i][j],dp[i][j-1]);for(i=1;i<=n;i++) for(j=i;j<=n;j++){upMax(f[cur][2][i][j],dp[i][j]+S(i,j));}for(i=1;i<=n;i++) for(j=i;j<=n;j++) dp[i][j]=f[pre][2][i][j];for(j=1;j<=n;j++) for(i=1;i<j;i++) upMax(dp[i+1][j],dp[i][j]);for(i=1;i<=n;i++) for(j=i;j<=n;j++) upMax(dp[i][j+1],dp[i][j]);  for(i=1;i<=n;i++) for(j=i;j<=n;j++){upMax(f[cur][2][i][j],dp[i][j]+S(i,j));}//3for(i=1;i<=n;i++) for(j=i;j<=n;j++) dp[i][j]=f[pre][2][i][j];for(j=1;j<=n;j++) for(i=j;i>=1;i--) upMax(dp[i-1][j],dp[i][j]);for(i=1;i<n;i++) for(j=i+1;j<=n;j++){upMax(f[cur][3][i][j],dp[i+1][j]+S(i,j));upMax(f[cur][3][i][j],f[pre][3][i][j]+S(i,j));}//4int tmp=f[pre][4][1][1];for(i=1;i<=n;i++) for(j=i;j<=n;j++) upMax(tmp,f[pre][3][i][j]);f[cur][4][1][1]=tmp;//5for(i=1;i<=n;i++) for(j=i;j<=n;j++) if(j-i+1>=3){upMax(f[cur][5][i][j],f[pre][4][1][1]+S(i,j));}//6for(i=1;i<=n;i++) for(j=i;j<=n;j++) if(j-i+1>=3){upMax(f[cur][6][i][j],f[pre][5][i][j]+S(i,i)+S(j,j));upMax(f[cur][6][i][j],f[pre][6][i][j]+S(i,i)+S(j,j));}//7for(i=1;i<=n;i++) for(j=i;j<=n;j++) if(j-i+1>=3){upMax(f[cur][7][i][j],f[pre][6][i][j]+S(i,j));}//8tmp=f[pre][8][1][1];for(i=1;i<=n;i++) for(j=i;j<=n;j++) upMax(tmp,f[pre][7][i][j]);f[cur][8][1][1]=tmp;//9for(i=1;i<=n;i++) for(j=i;j<=n;j++) if(j-i+1>=3){upMax(f[cur][9][i][j],f[pre][8][1][1]+S(i,i)+S(j,j));upMax(f[cur][9][i][j],f[pre][9][i][j]+S(i,i)+S(j,j));}//10for(i=1;i<=n;i++) for(j=i;j<=n;j++) if(j-i+1>=3){upMax(f[cur][10][i][j],f[pre][9][i][j]+S(i,j));upMax(f[cur][10][i][j],f[pre][10][i][j]+S(i,j));}//11for(i=1;i<=n;i++) for(j=i;j<=n;j++) if(j-i+1>=3){upMax(f[cur][11][i][j],f[pre][10][i][j]+S(i,i)+S(j,j));upMax(f[cur][11][i][j],f[pre][11][i][j]+S(i,i)+S(j,j));ans=max(ans,f[cur][11][i][j]);}pre^=1;cur^=1;}printf("%d\n",ans);
}

BZOJ 3241: [Noi2013]书法家相关推荐

  1. BZOJ 3240([Noi2013]矩阵游戏-费马小定理【矩阵推论】-%*s-快速读入)

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec   Memory Limit: 256 MB Submit: 123   Solved: 73 [ Submit][ St ...

  2. BZOJ 3244: [Noi2013]树的计数

    传送门 神仙题... 和树的深度有关,由于 $BFS$ 序的性质,显然可以通过把 $BFS$ 序分成若干段来求出深度,每一段就对应某一深度从左到右的所有节点,那么如果确定了分的段数就确定了树的深度(分 ...

  3. 【DP】[NOI2013]书法家

    题目描述 小 E 同学非常喜欢书法,他听说 NOI2013 已经开始了,想题一幅 "NOI" 的字送给大家. 小 E 有一张非常神奇的纸,纸可以用一个 n 行 m 列的二维方格矩阵 ...

  4. BZOJ 3240 [Noi2013] 矩阵游戏 题解

    转载请注明:http://blog.csdn.net/jiangshibiao/article/details/24594825 [原题] 3240: [Noi2013]矩阵游戏 Time Limit ...

  5. bzoj 3242: [Noi2013]快餐店

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

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

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

  7. (十进制快速幂+矩阵优化)BZOJ 3240 3240: [Noi2013]矩阵游戏

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=3240 3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  M ...

  8. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  9. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

最新文章

  1. java虚拟机启动参数Xms,启动JVM时,-Xms和-Xmx参数是什么?
  2. 画直线_在鸡的面前画直线,鸡为什么会晕呢,西瓜视频带你揭秘
  3. SpringBoot整合Minio 项目中使用自己文件存储服务器
  4. php7 安装zendopcache,安装PHP加速插件ZendOpcache
  5. oracle时间用法
  6. c语言 错误 无效的控制谓词,PAT 1025反转链表的代码实现及错误分析(C语言)
  7. 【TensorFlow-windows】学习笔记四——模型构建、保存与使用
  8. 通过在Chipotle用餐了解模板方法设计模式
  9. java正则表达式 ascii_Java——正则表达式
  10. 配置主机间信任的一个简单办法
  11. Monkeyrunner介绍
  12. 路由器重温——BGP路由-1
  13. C语言二级题库(刷题软件+60套真题+填空题+大题)2022年9月份新题第三套
  14. [易飞]包材Forcast四周滚动需求
  15. 打印机无法双面打印处理办法
  16. 如何将一串数字用函数的方法倒过来(C语言)
  17. Android小程序-涂鸦板
  18. Android(一)
  19. MAC装win10 清理临时文件
  20. 在python中逻辑量有_(五)我的魔法竟有了一丝逻辑

热门文章

  1. 人们怕人工智能获得意识到底是怕哪个方面?
  2. SAP MM 事务代码MRKO触发的财务凭证不会出现在PO History里
  3. 2010年—2018年中国电商成交额排名
  4. 算法战:需要人工智能生态系统来增强安全性
  5. 心得丨老生常谈:普通程序员到底如何入门深度学习?
  6. 业界丨全球AI人才排行榜:美国第一,中国仅排名第7
  7. 清华博士后用10分钟讲解AlphaCode背后的技术原理,原来程序员不是那么容易被取代的!...
  8. 孙正义:未来30年投资趋势【附PPT】
  9. 清华大学精密仪器系:智能传感器太重要了!
  10. 【星·企业】竞逐卫星互联网“新基建”,「九天微星」完成2.7亿元B 轮融资