http://uoj.ac/problem/125

我真是日狗了。。。。。。

果然还是没有耐心读题,搞到读题读错了2个地方,结果调试了半天。。。。。。

言归正传。

动态规划。

这种题目很常见。

我们发现竖着做比较麻烦,那么可以横着做。

打竖将"NOI“分成11种类型。

F[i][j][k][l]表示第i列的涂色部分的上边界为j,下边界为k,类型为l。

然后转移。

从2类型->2类型有点麻烦,我们可以借组一个辅助数组b,见程序注释部分。

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<iostream>
  4. #include<fstream>
  5. #include<algorithm>
  6. #include<cstring>
  7. #include<string>
  8. #include<cmath>
  9. #include<queue>
  10. #include<stack>
  11. #include<map>
  12. #include<utility>
  13. #include<set>
  14. #include<bitset>
  15. #include<vector>
  16. #include<functional>
  17. #include<deque>
  18. #include<cctype>
  19. #include<climits>
  20. #include<complex>
  21. //#include<bits/stdc++.h>适用于CF,UOJ,但不适用于poj
  22.  
  23. using namespace std;
  24.  
  25. typedef long long LL;
  26. typedef double DB;
  27. typedef pair<int,int> PII;
  28. typedef complex<DB> CP;
  29.  
  30. #define mmst(a,v) memset(a,v,sizeof(a))
  31. #define mmcy(a,b) memcpy(a,b,sizeof(a))
  32. #define re(i,a,b) for(i=a;i<=b;i++)
  33. #define red(i,a,b) for(i=a;i>=b;i--)
  34. #define fi first
  35. #define se second
  36. #define m_p(a,b) make_pair(a,b)
  37. #define SF scanf
  38. #define PF printf
  39. #define two(k) (1<<(k))
  40.  
  41. template<class T>inline T sqr(T x){return x*x;}
  42. template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
  43. template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;}
  44.  
  45. const DB EPS=1e-;
  46. inline int sgn(DB x){if(abs(x)<EPS)return ;return(x>)?:-;}
  47. const DB Pi=acos(-1.0);
  48.  
  49. inline void clear(vector<int> *A,int a,int b){int i,j;A->clear();re(i,,a)re(j,,b)A[i].push_back();}
  50.  
  51. inline int gint()
  52. {
  53. int res=;bool neg=;char z;
  54. for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
  55. if(z==EOF)return ;
  56. if(z=='-'){neg=;z=getchar();}
  57. for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
  58. return (neg)?-res:res;
  59. }
  60. inline LL gll()
  61. {
  62. LL res=;bool neg=;char z;
  63. for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
  64. if(z==EOF)return ;
  65. if(z=='-'){neg=;z=getchar();}
  66. for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
  67. return (neg)?-res:res;
  68. }
  69.  
  70. const int maxN=;
  71. const int maxM=;
  72. const int INF=;
  73.  
  74. int N,M;
  75. int mp[maxN+][maxM+];
  76. int sum[maxM+][maxN+];
  77. int x,y,F[][maxN+][maxN+][];
  78. int ans;
  79.  
  80. inline int ask(int r,int x,int y){return sum[r][y]-sum[r][x-];}
  81.  
  82. int b[maxN+];
  83.  
  84. inline void clear(int x){int j,k,l;re(j,,N+)re(k,,N+)re(l,,+) F[x][j][k][l]=-INF;}
  85.  
  86. int main()
  87. {
  88. freopen("penman.in","r",stdin);
  89. freopen("penman.out","w",stdout);
  90. int i,j,k;
  91. N=gint();M=gint();
  92. re(i,,N)re(j,,M)mp[i][j]=gint();
  93. re(i,,M)re(j,,N)sum[i][j]=sum[i][j-]+mp[j][i];
  94. x=;y=;
  95. clear(y);
  96. re(j,,N)re(k,j,N)F[y][j][k][]=ask(,j,k);
  97. ans=-INF;
  98. re(i,,M)
  99. {
  100. int t;
  101.  
  102. swap(x,y);
  103. clear(y);
  104.  
  105. //
  106. re(j,,N)re(k,j,N)
  107. {
  108. upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,k));
  109. upmax(F[y][j][k][],ask(i,j,k));
  110. }
  111.  
  112. //
  113. re(j,,N)
  114. {
  115. t=F[x][j][N][];
  116. red(k,N-,j)
  117. {
  118. upmax(F[y][j][k][],t+ask(i,j,k));
  119. upmax(t,F[x][j][k][]);
  120. }
  121. }
  122. /*
  123. (1)
  124. l=j
  125. r=j..k
  126. */
  127. re(j,,N)
  128. {
  129. t=-INF;
  130. re(k,j,N)
  131. {
  132. upmax(t,F[x][j][k][]);
  133. upmax(F[y][j][k][],t+ask(i,j,k));
  134. }
  135. }
  136. /*
  137. (2)
  138. re(l,1,j-1)
  139. re(r,j-1,k)
  140. F[i-1][l][r][2]
  141. b[r]表示F[i-1][1..j-1][r][2]的最大值,b[r]随着j的递增的递增
  142. 求b[j-1...k]的最大值
  143. */
  144. re(j,,N+)b[j]=-INF;
  145. re(j,,N)
  146. {
  147. t=-INF;
  148. re(k,j-,N)
  149. {
  150. upmax(b[k],F[x][j-][k][]);
  151. upmax(t,b[k]);
  152. if(k>=j) upmax(F[y][j][k][],t+ask(i,j,k));
  153. }
  154. }
  155. /*int l,r;
  156. re(j,1,N)re(k,j,N)re(l,j,j)re(r,j,k)upmax(F[y][j][k][2],F[x][l][r][2]+ask(i,j,k));
  157. re(j,1,N)re(k,j,N)re(l,1,j-1)re(r,j-1,k)upmax(F[y][j][k][2],F[x][l][r][2]+ask(i,j,k));*/
  158.  
  159. //
  160. re(j,,N)re(k,j,N)upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,k));
  161. re(k,,N)
  162. {
  163. t=F[x][k][k][];
  164. red(j,k-,)
  165. {
  166. upmax(F[y][j][k][],t+ask(i,j,k));
  167. upmax(t,F[x][j][k][]);
  168. }
  169. }
  170.  
  171. //
  172. re(j,,N)re(k,j,N)upmax(F[y][j][k][],F[x][j][k][]);
  173. t=-INF;
  174. re(j,,N)
  175. re(k,j,N)
  176. upmax(t,F[x][j][k][]);
  177. re(j,,N)re(k,j,N)upmax(F[y][j][k][],t);
  178.  
  179. //
  180. re(j,,N)re(k,j+,N)
  181. {
  182. upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,k));
  183. }
  184.  
  185. //
  186. re(j,,N)re(k,j+,N)
  187. {
  188. upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,j)+ask(i,k,k));
  189. upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,j)+ask(i,k,k));
  190. }
  191.  
  192. //
  193. re(j,,N)re(k,j+,N)
  194. {
  195. upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,k));
  196. }
  197.  
  198. //
  199. re(j,,N)re(k,j,N)upmax(F[y][j][k][],F[x][j][k][]);
  200. t=-INF;
  201. re(j,,N)re(k,j+,N)upmax(t,F[x][j][k][]);
  202. re(j,,N)re(k,j,N)upmax(F[y][j][k][],t);
  203.  
  204. //
  205. re(j,,N)re(k,j+,N)
  206. {
  207. upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,j)+ask(i,k,k));
  208. upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,j)+ask(i,k,k));
  209. }
  210.  
  211. //
  212. re(j,,N)re(k,j+,N)
  213. {
  214. upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,k));
  215. upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,k));
  216. }
  217.  
  218. //
  219. re(j,,N)re(k,j+,N)
  220. {
  221. upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,j)+ask(i,k,k));
  222. upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,j)+ask(i,k,k));
  223. upmax(ans,F[y][j][k][]);
  224. }
  225.  
  226. }
  227. cout<<ans<<endl;
  228. return ;
  229. }

NOI 2013 书法家的更多相关文章

  1. 【BZOJ 3242】【UOJ #126】【CodeVS 3047】【NOI 2013】快餐店

    http://www.lydsy.com/JudgeOnline/problem.php?id=3242 http://uoj.ac/problem/126 http://codevs.cn/prob ...

  2. NOI 2013 矩阵游戏

    http://uoj.ac/problem/124 矩阵乘法. 十进制快速幂. 刚开始还傻傻地写二进制快速幂,然后陈老师一语点醒梦中人...... #include<cstdio> #in ...

  3. 「BZOJ 3242」「NOI 2013」快餐店「基环树」

    题意 基环树上找到一个点(可以在边上)使得它到树上最远点的距离最小,输出最小距离 题解 如果是一棵树,答案就是树的直径\(/2\) 如果是基环树,那么很好证明删去环上的某一条边是不影响答案的.于是断环 ...

  4. CF 329A(Purification-贪心-非DLX)

    A. Purification time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  5. 2013 Asia Changsha Regional Contest---Josephina and RPG(DP)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4800 Problem Description A role-playing game (RPG and ...

  6. SharePoint 2013: A feature with ID has already been installed in this farm

    使用Visual Studio 2013创建一个可视web 部件,当右击项目选择"部署"时报错: "Error occurred in deployment step ' ...

  7. Visual Studio 2013 添加一般应用程序(.ashx)文件到SharePoint项目

    默认,在用vs2013开发SharePoint项目时,vs没有提供一般应用程序(.ashx)的项目模板,本文解决此问题. 以管理员身份启动vs2013,创建一个"SharePoint 201 ...

  8. SharePoint 2013 create workflow by SharePoint Designer 2013

    这篇文章主要基于上一篇http://www.cnblogs.com/qindy/p/6242714.html的基础上,create a sample workflow by SharePoint De ...

  9. Install and Configure SharePoint 2013 Workflow

    这篇文章主要briefly introduce the Install and configure SharePoint 2013 Workflow. Microsoft 推出了新的Workflow ...

随机推荐

  1. AES的S-BOX构造优化

    之前写过SBOX的构造,后来看到别人的优秀思路,借鉴过来重新改了一点. 原文地址:http://www.cnblogs.com/7hat/p/3383546.html 主要是将矩阵运算改为列运算之和, ...

  2. (转)命令行下,用 xcodebuild 生成ipa文件,通过 itms-services 协议安装

    准备工作:已经设置好,xcode中的证书,证书必须是企业级证书,才能通过 itms-services 协议安装 Step 1:  把以下代码保存到一个web目录中,命名为 “auto.plist”,注 ...

  3. hdu 4605-Magic Ball Game(树状数组)

    题目大意: 给你一棵二叉树,每个节点有一个w值,现在有一颗小球,值为x,从根节点往下掉,如果w==x,那么它就会停止:如果w>x,那么它往左.右儿子的概率都是1.2:如果w<x,那么它往左 ...

  4. Redis起步

    Rdis和JQuery一样是纯粹为应用而产生的,这里记录的是在CentOS 5.7上学习入门文章: 1.Redis简介  Redis是一个key-value存储系统.和Memcached类似,但是解决 ...

  5. Java基础知识强化58:经典排序之二叉树排序(BinaryTreeSort)

    1. 二叉树排序 二叉树排序的描述也是一个递归的描述, 所以二叉树排序的构造自然也用递归的: 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它 ...

  6. js验证表单并提交

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. arcmap从excel坐标数据生成点shp文件

    概述 今天试图在ArcMap中将excel数据转成点文件,在"Display XY Data"的时候,无法选择X,Y字段,很是纳闷,原来Excel中列的格式是文本,导致无法选择.有 ...

  8. Objective-C 类型判断

    可以通过 isKindOfClass 判断对象的类型 @interface A : NSObject @end @implementation A @end //// @interface AA : ...

  9. div滚动条,可以自由的给滚动条定义背景,上下按钮,当然不仅仅是颜色,连图片当背景也可以。

    可以自由的给滚动条定义背景,上下按钮,当然不仅仅是颜色,连图片当背景也可以.支持鼠标滚轮,点击滚动条滚轴定位,上下按钮久按加速,兼容firefox,谷歌 下载地址

  10. 使用angularjs中ng-repeat的$even与$odd属性时的注意事项

    JavaScript中数组的索引是从0开始的,因此我们再取奇偶的时候需要用!$even和!$odd来将$even和$odd的布尔值反转 下面给出一个实例: 使用$odd和$even来制作一个红蓝相间的 ...