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. Mysql auto_increment 重新计数(让id从1开始)

    当清空一个表的时候,重新插入数据,发现auto_increment属性的字段计数不是从1开始的时候,可以使用以下命令   方法一 delete from test; alter table `test ...

  2. HDFS文件系统的操作

    package com.bank.utils; import java.io.BufferedInputStream;import java.io.BufferedOutputStream;impor ...

  3. 从此走上一条iOS程序猿不归路。。。

    新的城市,新的生活!前不久刚刚结束了苦逼的面试找工作之旅,期间也小有收货,如今正处年底工作闲暇之余,将前一阵子陆陆续续的总结整理了一下,本人菜鸟程序猿一只,水平有限,本文总结的知识不算深入,比较浅显, ...

  4. 把本地建好的项目提交到git上

    才开始用git来控制项目版本,刚开始时不是很会用,由于公司最近新开个项目,需要我把建好的项目放到git上去,慢慢的摸索,终于有点小小的结果,把一个项目成功提交到git上了,在这里记录下,以免下次忘记, ...

  5. dojo 学习笔记之dojo.query - query(id) 与query(class)的差别

    考虑这个样例:动态创建一个页面的时候,用new listtem()生成多个listitem, 且每一个listitem中都生成一个按钮button. 假设想要给每一个按钮都绑定一个click事件,用d ...

  6. Hibernate介绍

    1.什么是Hibernate? 首先,Hibernate是数据持久层的一个轻量级框架.数据持久层的框架有很多比如:iBATIS,myBatis,Nhibernate,Siena等等. 并且Hibern ...

  7. iOS 音频开发经验汇总

    一.音乐播放类概念 iOS 下能支持歌曲和声音播放的的类有几个: SystemSound AVFoundtion库中的AVAudioPlayer #重要 MediMPMusicPlayerContro ...

  8. Hide the common top menu in Ubuntu 12.04

    隐藏:1.sudo apt-get autoremove appmenu-gtk appmenu-gtk3 appmenu-qt2.reboot 恢复: 1.sudo apt-get install ...

  9. alias

    1.语法:alias[别名]=[指令名称] [root@rusky /]# alias pingm="ping 127.0.0.1"  [root@rusky /]# pingmP ...

  10. mysql 的密码重置

    Windows: 1.以系统管理员登陆: 2.停止MySQL服务: 3.进入CMD,进入MySQL的安装目录,假设是D:/MySQL/MySQL Server 5.0/: 4.跳过权限检查启动MySQ ...