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. shell中的替换

    shell中如果存在一些特殊的字符,就需要进行替换,可进行命令替换.变量替换.转义替换 1.转义字符的替换 shell中包含以下的转移字符 \a   响铃警报\\   反斜杠 \b  退格(删除键) ...

  2. Java IntelliJ IDEA 不能显示项目里的文件结构解决办法

    按下列步骤操作: 1. 关闭IDEA,  2.然后删除项目文件夹下的.idea文件夹 3.重新用IDEA工具打开项目

  3. javascript中this、apply、call、bind的用法和区别

    参考阮一峰文章链接:http://javascript.ruanyifeng.com/oop/basic.html#toc10

  4. C++编程规范之19:总是初始化变量

    摘要: 一切从白纸开始,未初始化的变量是C和C++程序中错误的常见来源.养成在使用内存之前先清除的习惯,可以避免这种错误,在定义变量的时候就将其初始化. 按照C和C++相同的低层高效率传统,通常并不要 ...

  5. 大数据笔记09:大数据之Hadoop的HDFS使用

    1. HDFS使用: HDFS内部中提供了Shell接口,所以我们可以以命令行的形式操作HDFS

  6. C# winform xml的增删改查

    代码如下: using System; using System.Collections.Generic; using System.IO; using System.Linq; using Syst ...

  7. Word03-文档中的截图显示不全

    今天写文档时遇到个很蛋疼的问题,在doc文档中复制进去的截图总是显示不全,图片上半部分都被文字遮盖了,折腾半天,最后还是网上找到了答案. 解决方法如下: 将图片所在行的段落行距修改为其它值即可,原来为 ...

  8. python课程第一天作业1-模拟登录

    第一周作业: 作业1:编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 流程图: 代码:后来修改过一次: #!/usr/bin/env python # -*-conding:ut ...

  9. Tree( 树) 组件[4]

    本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件.一.方法列表 //部分方法onClick : funct ...

  10. Web文件管理:elFinder.Net(支持FTP)

    elFinder 是一个基于 Web 的文件管理器,灵感来自 Mac OS X 的 Finder 程序. elFinder.Net是.Net版本的一个Demo,使用ASP.NET MVC 4集成,可以 ...