题目链接: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); //1
for(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));
} //2
for(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));
} //3
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=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)); } //4
int 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; //5
for(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));
} //6
for(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));
} //7
for(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));
}
//8
tmp=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; //9
for(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));
}
//10
for(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));
}
//11
for(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 3242: [Noi2013]快餐店 章鱼图

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

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

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

  3. BZOJ 3240: [Noi2013]矩阵游戏

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

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

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

  5. [Noi2013]书法家

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

  6. BZOJ3241/UOJ125 [Noi2013]书法家

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

  7. bzoj 3242: [Noi2013]快餐店

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

  8. bzoj 3244: [Noi2013]树的计数

    Description 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的DFS序以及BFS序.两棵不同的树的DFS序有可能相同,并且它们的BFS序也有可能相同, ...

  9. 【uoj125】 NOI2013—书法家

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

随机推荐

  1. 2016-9-6 批量给文件名的前面加上“igeek_高薪就业” 2、 利用FileInputStream和FileOutputStream复制文件

    在此只列出典型题目,有的题目扫一眼就有代码的不去浪费时间了,想要完整题目的评论留邮箱,看到就发.持续更新中... 1.批量给文件名的前面加上“igeek_高薪就业” package com.work; ...

  2. zw版【转发·台湾nvp系列Delphi例程】HALCON RegionToBin1

    zw版[转发·台湾nvp系列Delphi例程]HALCON RegionToBin1 unit Unit1;interfaceuses Windows, Messages, SysUtils, Var ...

  3. yii2语言设置

    1.父配置文件在yii2/base/Application中的$language="en-US", 修改项目的语言可以修改项目的配置文件main.php中加'language'=& ...

  4. 对Alexia(minmin)网友代码的评论及对“求比指定数大且最小的‘不重复数’问题”代码的改进

    应Alexia(minmin)网友之邀,到她的博客上看了一下她的关于“求比指定数大且最小的‘不重复数’问题”的代码(百度2014研发类校园招聘笔试题解答),并在评论中粗略地发表了点意见. 由于感觉有些 ...

  5. 【转】The Attached Behavior Pattern

    原文:http://www.bjoernrochel.de/2009/08/19/the-attached-behavior-pattern/ The Attached Behavior Patter ...

  6. selenium+phantomJS学习使用记录

    背景知识: phantomjs是一个基于webkit的没有界面的浏览器,所以运行起来比完整的浏览器要高效. selenium是一个测试web应用的工具,目前是2.42.1版本,和1版的区别在于2.0+ ...

  7. access数据库导入Oracle

    1.对着当前的表右击->导出->选择下面的保存类型为"ODBC数据库"找一个路径输入文件名2.将x导出到x,点击->确定3.在弹出的对话框中DSN名称,点击-&g ...

  8. HttpClient I/O exception (java.net.SocketException) caught when processing request: Connect

    转自:http://luan.iteye.com/blog/1820054 I/O exception (java.net.SocketException) caught when processin ...

  9. ACM第四站————最小生成树(克鲁斯卡尔算法)

    都是生成最小生成树,库鲁斯卡尔算法与普里姆算法的不同之处在于——库鲁斯卡尔算法的思想是以边为主,找权值最小的边生成最小生成树. 主要在于构建边集数组,然后不断寻找最小的边. 同样的题目:最小生成树 题 ...

  10. HDU 2067:小兔的棋盘

    小兔的棋盘 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...