http://uoj.ac/problem/125

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

果然还是没有耐心读题,搞到读题读错了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 书法家的更多相关文章

  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. java——Arrays.asList()方法

    Arrays.asList() 是将数组作为列表 问题来源于: public class Test { public static void main(String[] args) { int[] a ...

  2. 简单Mysql思维导图

  3. 让iframe调用页面的背景透明

    需求:在一个div里面嵌套一个iframe(src="ui.html"),div有背景图片,要让iframe里的内容透明地显示在div层上. 刚开始直接把iframe放在div中, ...

  4. TTTAttributedLabel使用介绍(转)

    TTTAttributedLabel 库地址 https://github.com/TTTAttributedLabel/TTTAttributedLabel 可以实现电话  地址  链接自动查找显示 ...

  5. Lance老师UI系列教程第八课->新浪新闻SlidingMenu界面的实现

    UI系列教程第八课:Lance老师UI系列教程第八课->新浪新闻SlidingMenu界面的实现 今天蓝老师要讲的是关于新浪新闻侧滑界面的实现.先看看原图: 如图所示,这种侧滑效果以另一种方式替 ...

  6. js中的call()与apply()

    js中的call()函数和apply()函数: 1.主要作用:是用于指定作用域和传参 (1)用于指定作用域 window.color = "red"; var o = { colo ...

  7. Gson序列化对象时排除字段

    import com.google.gson.ExclusionStrategy; import com.google.gson.FieldAttributes; /** *Gson序列化对象排除属性 ...

  8. 监听tableview的点击事件

    // 监听tablview的点击事件 - (void)addAGesutreRecognizerForYourView { UITapGestureRecognizer *tapGesture = [ ...

  9. mybatis分页插件以及懒加载

    1.   延迟加载 延迟加载的意义在于,虽然是关联查询,但不是及时将关联的数据查询出来,而且在需要的时候进行查询. 开启延迟加载: <setting name="lazyLoading ...

  10. Linux命令之用户与组管理

    介绍 Linux操作系统中,任何文件都归属某一特定的用户,而任何用户都隶属至少一个用户组.用户是否有权限对某文件进行访问.读写以及执行,受到系统严格约束的正式这种清晰.严谨的用户与用户组管理系统.在很 ...