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 ...
随机推荐
- linux patch
作为程序员,了解diff&patch命 令是非常必要的.比如说我们发现某个项目有bug代码,而自己又没有svn的提交权限,那么此时最合适的解决方法就是用diff命令做一个补丁发给项目成 员.项 ...
- Engineering Economics
相关简介 工程经济学 –-研究各种技术在使用过程中如何以最小的投入获得预期产出或者说如何以等量的投入获得最大的产出: –-如何用最低的寿命周期成本实现产品.作业以及服务的必要功能. 软件工程经济学 工 ...
- (转)基于企业级证书的IOS应用打包升级功能介绍
IOS应用程序升级流程介绍:IOS手机端应用程序需要升级时,打开服务器端html文件(本文为ucab.html文件)->点击在线安装->打开plist文件(本文中为ucab.plist文件 ...
- Android中设置文本颜色的三种方法
最近刚开始学web,发现好的颜色搭配可以让自己的网页更加美观, 中午不想做事,就无聊滴花了两个小时测试了所有颜色的编码,总结如下 新手没有什么吊炸天的技术,仅仅是一份辅助的文档,有兴趣的朋友可以收藏下 ...
- 使用zTree控件制作的表格形式的树形+数据菜单
測试了一下,兼容ie7以上, chrome opera ff 不使用对方css /*------------------------------------- zTree Style version: ...
- 设计模式17---设计模式之模板方法模式(Template Method)(行为型)
1.场景模拟 使用软件模拟登录控制,普通用户和工作人员用户,工作人员的密码在数据库中是加密的. 步骤大致如下: 前台提交,后台获取登录信息,同数据库中的登陆信息进行比较,只不过工作人员是加密的,普通用 ...
- Log4Qt 使用(二)
本文基于上一篇<Log4Qt 使用(一)>来继续完善一下关于Log4Qt的使用. 在讲解之前,我们首先来看一个例子: int main(int argc, char *argv[]) { ...
- Java基础知识强化44:StringBuffer类之把数组拼接成指定格式的字符串的案例
1. 先看案例代码如下: package cn.itcast_07; /* * 把数组拼接成一个字符串 */ public class StringBufferTest2 { public stati ...
- rhel Linux系统yum的配置
yum是一个很方便的linux系统软件管理工具,但是很多新手还是不会配置yum,下面详细的介绍下yum的配置方法,其实很简单. 1.首先确保系统ISO镜像已经成功挂载,可以用df -h命令查看.2.创 ...
- Slider( 滑动条) 组件
本节课重点了解 EasyUI 中 Slider(滑动条)组件的使用方法,这个组件依赖于Draggable(拖动)组件. 一. 加载方式//class 加载方式<input class=" ...