NOI 2013 书法家
我真是日狗了。。。。。。
果然还是没有耐心读题,搞到读题读错了2个地方,结果调试了半天。。。。。。
言归正传。
动态规划。
这种题目很常见。
我们发现竖着做比较麻烦,那么可以横着做。
打竖将"NOI“分成11种类型。
F[i][j][k][l]表示第i列的涂色部分的上边界为j,下边界为k,类型为l。
然后转移。
从2类型->2类型有点麻烦,我们可以借组一个辅助数组b,见程序注释部分。
- #include<cstdio>
- #include<cstdlib>
- #include<iostream>
- #include<fstream>
- #include<algorithm>
- #include<cstring>
- #include<string>
- #include<cmath>
- #include<queue>
- #include<stack>
- #include<map>
- #include<utility>
- #include<set>
- #include<bitset>
- #include<vector>
- #include<functional>
- #include<deque>
- #include<cctype>
- #include<climits>
- #include<complex>
- //#include<bits/stdc++.h>适用于CF,UOJ,但不适用于poj
- using namespace std;
- typedef long long LL;
- typedef double DB;
- typedef pair<int,int> PII;
- typedef complex<DB> CP;
- #define mmst(a,v) memset(a,v,sizeof(a))
- #define mmcy(a,b) memcpy(a,b,sizeof(a))
- #define re(i,a,b) for(i=a;i<=b;i++)
- #define red(i,a,b) for(i=a;i>=b;i--)
- #define fi first
- #define se second
- #define m_p(a,b) make_pair(a,b)
- #define SF scanf
- #define PF printf
- #define two(k) (1<<(k))
- template<class T>inline T sqr(T x){return x*x;}
- template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
- template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;}
- const DB EPS=1e-;
- inline int sgn(DB x){if(abs(x)<EPS)return ;return(x>)?:-;}
- const DB Pi=acos(-1.0);
- 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();}
- inline int gint()
- {
- int res=;bool neg=;char z;
- for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
- if(z==EOF)return ;
- if(z=='-'){neg=;z=getchar();}
- for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
- return (neg)?-res:res;
- }
- inline LL gll()
- {
- LL res=;bool neg=;char z;
- for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
- if(z==EOF)return ;
- if(z=='-'){neg=;z=getchar();}
- for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
- return (neg)?-res:res;
- }
- const int maxN=;
- const int maxM=;
- const int INF=;
- int N,M;
- int mp[maxN+][maxM+];
- int sum[maxM+][maxN+];
- int x,y,F[][maxN+][maxN+][];
- int ans;
- inline int ask(int r,int x,int y){return sum[r][y]-sum[r][x-];}
- int b[maxN+];
- inline void clear(int x){int j,k,l;re(j,,N+)re(k,,N+)re(l,,+) F[x][j][k][l]=-INF;}
- int main()
- {
- freopen("penman.in","r",stdin);
- freopen("penman.out","w",stdout);
- int i,j,k;
- N=gint();M=gint();
- re(i,,N)re(j,,M)mp[i][j]=gint();
- re(i,,M)re(j,,N)sum[i][j]=sum[i][j-]+mp[j][i];
- x=;y=;
- clear(y);
- re(j,,N)re(k,j,N)F[y][j][k][]=ask(,j,k);
- ans=-INF;
- re(i,,M)
- {
- int t;
- swap(x,y);
- clear(y);
- //
- re(j,,N)re(k,j,N)
- {
- upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,k));
- upmax(F[y][j][k][],ask(i,j,k));
- }
- //
- re(j,,N)
- {
- t=F[x][j][N][];
- red(k,N-,j)
- {
- upmax(F[y][j][k][],t+ask(i,j,k));
- upmax(t,F[x][j][k][]);
- }
- }
- /*
- (1)
- l=j
- r=j..k
- */
- re(j,,N)
- {
- t=-INF;
- re(k,j,N)
- {
- upmax(t,F[x][j][k][]);
- upmax(F[y][j][k][],t+ask(i,j,k));
- }
- }
- /*
- (2)
- re(l,1,j-1)
- re(r,j-1,k)
- F[i-1][l][r][2]
- b[r]表示F[i-1][1..j-1][r][2]的最大值,b[r]随着j的递增的递增
- 求b[j-1...k]的最大值
- */
- re(j,,N+)b[j]=-INF;
- re(j,,N)
- {
- t=-INF;
- re(k,j-,N)
- {
- upmax(b[k],F[x][j-][k][]);
- upmax(t,b[k]);
- if(k>=j) upmax(F[y][j][k][],t+ask(i,j,k));
- }
- }
- /*int l,r;
- 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));
- 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));*/
- //
- re(j,,N)re(k,j,N)upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,k));
- re(k,,N)
- {
- t=F[x][k][k][];
- red(j,k-,)
- {
- upmax(F[y][j][k][],t+ask(i,j,k));
- upmax(t,F[x][j][k][]);
- }
- }
- //
- re(j,,N)re(k,j,N)upmax(F[y][j][k][],F[x][j][k][]);
- t=-INF;
- re(j,,N)
- re(k,j,N)
- upmax(t,F[x][j][k][]);
- re(j,,N)re(k,j,N)upmax(F[y][j][k][],t);
- //
- re(j,,N)re(k,j+,N)
- {
- upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,k));
- }
- //
- re(j,,N)re(k,j+,N)
- {
- upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,j)+ask(i,k,k));
- upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,j)+ask(i,k,k));
- }
- //
- re(j,,N)re(k,j+,N)
- {
- upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,k));
- }
- //
- re(j,,N)re(k,j,N)upmax(F[y][j][k][],F[x][j][k][]);
- t=-INF;
- re(j,,N)re(k,j+,N)upmax(t,F[x][j][k][]);
- re(j,,N)re(k,j,N)upmax(F[y][j][k][],t);
- //
- re(j,,N)re(k,j+,N)
- {
- upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,j)+ask(i,k,k));
- upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,j)+ask(i,k,k));
- }
- //
- re(j,,N)re(k,j+,N)
- {
- upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,k));
- upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,k));
- }
- //
- re(j,,N)re(k,j+,N)
- {
- upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,j)+ask(i,k,k));
- upmax(F[y][j][k][],F[x][j][k][]+ask(i,j,j)+ask(i,k,k));
- upmax(ans,F[y][j][k][]);
- }
- }
- cout<<ans<<endl;
- return ;
- }
NOI 2013 书法家的更多相关文章
- 【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 ...
- NOI 2013 矩阵游戏
http://uoj.ac/problem/124 矩阵乘法. 十进制快速幂. 刚开始还傻傻地写二进制快速幂,然后陈老师一语点醒梦中人...... #include<cstdio> #in ...
- 「BZOJ 3242」「NOI 2013」快餐店「基环树」
题意 基环树上找到一个点(可以在边上)使得它到树上最远点的距离最小,输出最小距离 题解 如果是一棵树,答案就是树的直径\(/2\) 如果是基环树,那么很好证明删去环上的某一条边是不影响答案的.于是断环 ...
- CF 329A(Purification-贪心-非DLX)
A. Purification time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- 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 ...
- SharePoint 2013: A feature with ID has already been installed in this farm
使用Visual Studio 2013创建一个可视web 部件,当右击项目选择"部署"时报错: "Error occurred in deployment step ' ...
- Visual Studio 2013 添加一般应用程序(.ashx)文件到SharePoint项目
默认,在用vs2013开发SharePoint项目时,vs没有提供一般应用程序(.ashx)的项目模板,本文解决此问题. 以管理员身份启动vs2013,创建一个"SharePoint 201 ...
- SharePoint 2013 create workflow by SharePoint Designer 2013
这篇文章主要基于上一篇http://www.cnblogs.com/qindy/p/6242714.html的基础上,create a sample workflow by SharePoint De ...
- Install and Configure SharePoint 2013 Workflow
这篇文章主要briefly introduce the Install and configure SharePoint 2013 Workflow. Microsoft 推出了新的Workflow ...
随机推荐
- AES的S-BOX构造优化
之前写过SBOX的构造,后来看到别人的优秀思路,借鉴过来重新改了一点. 原文地址:http://www.cnblogs.com/7hat/p/3383546.html 主要是将矩阵运算改为列运算之和, ...
- (转)命令行下,用 xcodebuild 生成ipa文件,通过 itms-services 协议安装
准备工作:已经设置好,xcode中的证书,证书必须是企业级证书,才能通过 itms-services 协议安装 Step 1: 把以下代码保存到一个web目录中,命名为 “auto.plist”,注 ...
- hdu 4605-Magic Ball Game(树状数组)
题目大意: 给你一棵二叉树,每个节点有一个w值,现在有一颗小球,值为x,从根节点往下掉,如果w==x,那么它就会停止:如果w>x,那么它往左.右儿子的概率都是1.2:如果w<x,那么它往左 ...
- Redis起步
Rdis和JQuery一样是纯粹为应用而产生的,这里记录的是在CentOS 5.7上学习入门文章: 1.Redis简介 Redis是一个key-value存储系统.和Memcached类似,但是解决 ...
- Java基础知识强化58:经典排序之二叉树排序(BinaryTreeSort)
1. 二叉树排序 二叉树排序的描述也是一个递归的描述, 所以二叉树排序的构造自然也用递归的: 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它 ...
- js验证表单并提交
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- arcmap从excel坐标数据生成点shp文件
概述 今天试图在ArcMap中将excel数据转成点文件,在"Display XY Data"的时候,无法选择X,Y字段,很是纳闷,原来Excel中列的格式是文本,导致无法选择.有 ...
- Objective-C 类型判断
可以通过 isKindOfClass 判断对象的类型 @interface A : NSObject @end @implementation A @end //// @interface AA : ...
- div滚动条,可以自由的给滚动条定义背景,上下按钮,当然不仅仅是颜色,连图片当背景也可以。
可以自由的给滚动条定义背景,上下按钮,当然不仅仅是颜色,连图片当背景也可以.支持鼠标滚轮,点击滚动条滚轴定位,上下按钮久按加速,兼容firefox,谷歌 下载地址
- 使用angularjs中ng-repeat的$even与$odd属性时的注意事项
JavaScript中数组的索引是从0开始的,因此我们再取奇偶的时候需要用!$even和!$odd来将$even和$odd的布尔值反转 下面给出一个实例: 使用$odd和$even来制作一个红蓝相间的 ...