I-country

在\(n\times m\)的网格图中,给出每个格子的权值,寻找有k个格子的凸联通块,使包含的权值最大,\(N,M≤15,K≤225\)。

我们首先要知道凸联通块的定义

  1. 从任意一个位置到任意一个位置的路径中存在一条行走方向只有两个。
  2. 左右轮廓分别先递减后递增,先递增后递减。

显然定义1不能用来递推,考虑性质2,而且从考虑行列角度,我们要表现处理到哪一行,格子的选择有限制,要表现格子的选择,要表现轮廓单调性,我们要设当前想要表现哪种单调性,所以同时需要此行选择的列范围,判断单调性的合法,于是设\(w[i][j]\)表示第i行的前缀和,同时设\(f[i][j][k][l][0/1][0/1]\)表示处理到第i行,已选了j个格子,该行选第k列到第l列,0/1从左至右表示,左边和右边的是否递增(1表示递增,反之),于是有

\[f[i][j][k][l][0][0]=\max_{k\leq p,l\leq q\leq m}(f[i][j-(l-k+1)][p][q][0][0/1])+w[i][l]-w[i][k-1]
\]

\[f[i][j][k][l][0][1]=\max_{k\leq p\leq q\leq l}(f[i][j-(l-k+1)][p][q][0][1])+w[i][l]-w[i][k-1]
\]

\[f[i][j][k][l][1][0]=\max_{1\leq p\leq k,l\leq q\leq m}(f[i][j-(l-k+1)][p][q][0/1][0/1])+w[i][l]-w[i][k-1]
\]

\[f[i][j][k][l][1][1]=\max_{1\leq p\leq k\leq q\leq l}(f[i][j-(l-k+1)][p][q][0/1][1])+w[i][l]-w[i][k-1]
\]

边界:全部负无限大,特判此状态不与前面后接

答案:\(\max_{1\leq p\leq q\leq m}(f[n][m][p][q][1][0])\)

参考代码:

#include <iostream>
#include <cstdio>
#define il inline
#define ri register
#define intmax 0x7fffffff
using namespace std;
struct DP{
int i,l,r,d;DP* pre;
DP(){d=-intmax;}
}dp[16][256][16][16][2][2],ans;
int s[16][16];
template<class free>
il void cmp(free&,free&);
il void read(int&),print(DP*);
int main(){
int n,m,g;
read(n),read(m),read(g);
if(!g)return puts("Oil : 0"),0;
for(int i(1),j;i<=n;++i)
for(j=1;j<=m;++j)read(s[i][j]),s[i][j]+=s[i][j-1];
for(int i(1),j,k,l,p,q;i<=n;++i)
for(j=1;j<=g;++j)
for(k=1;k<=m;++k)
for(l=k;l<=m;++l){
if(j-(l-k+1)<0)continue;
//0 0
DP*x(&dp[i][j][k][l][0][0]);
for(p=k;p<=l;++p)
for(q=l;q<=m;++q)
cmp(*x,dp[i-1][j-(l-k+1)][p][q][0][0]),
cmp(*x,dp[i-1][j-(l-k+1)][p][q][0][1]);
if(x->d<0&&l-k+1==j)x->d=0,x->pre=NULL;
x->d+=s[i][l]-s[i][k-1],x->l=k,x->r=l,x->i=i;
//0 1
x=&dp[i][j][k][l][0][1];
for(p=k;p<=l;++p)
for(q=p;q<=l;++q)
cmp(*x,dp[i-1][j-(l-k+1)][p][q][0][1]);
if(x->d<0&&l-k+1==j)x->d=0,x->pre=NULL;
x->d+=s[i][l]-s[i][k-1],x->l=k,x->r=l,x->i=i;
//1 0
x=&dp[i][j][k][l][1][0];
for(p=1;p<=k;++p)
for(q=l;q<=m;++q)
cmp(*x,dp[i-1][j-(l-k+1)][p][q][1][0]),
cmp(*x,dp[i-1][j-(l-k+1)][p][q][1][1]),
cmp(*x,dp[i-1][j-(l-k+1)][p][q][0][0]),
cmp(*x,dp[i-1][j-(l-k+1)][p][q][0][1]);
if(x->d<0&&l-k+1==j)x->d=0,x->pre=NULL;
x->d+=s[i][l]-s[i][k-1],x->l=k,x->r=l,x->i=i;
//1 1
x=&dp[i][j][k][l][1][1];
for(p=1;p<=k;++p)
for(q=k;q<=l;++q)
cmp(*x,dp[i-1][j-(l-k+1)][p][q][1][1]),
cmp(*x,dp[i-1][j-(l-k+1)][p][q][0][1]);
if(x->d<0&&l-k+1==j)x->d=0,x->pre=NULL;
x->d+=s[i][l]-s[i][k-1],x->l=k,x->r=l,x->i=i;
}
for(int i(1),j,k,l,x,y;i<=n;++i)
for(k=1;k<=m;++k)
for(l=1;l<=m;++l)
for(x=0;x<2;++x)
for(y=0;y<2;++y)
if(dp[i][g][k][l][x][y].d>ans.d)
ans=dp[i][g][k][l][x][y];
printf("Oil : %d\n",ans.d),print(&ans);
return 0;
}
il void print(DP *x){
int i;
while(x!=NULL){
for(i=x->l;i<=x->r;++i)
printf("%d %d\n",x->i,i);
x=x->pre;
}
}
template<class free>
il void cmp(free &a,free &b){
if(a.d<b.d)a.d=b.d,a.pre=&b;
}
il void read(int &x){
x&=0;ri char c;while(c=getchar(),c<'0'||c>'9');
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
}

I-country的更多相关文章

  1. wifi的country code

    转自:http://userpage.chemie.fu-berlin.de/diverse/doc/ISO_3166.htmlCountry A 2 A 3 Number ------------- ...

  2. ural 1073. Square Country

    1073. Square Country Time limit: 1.0 secondMemory limit: 64 MB There live square people in a square ...

  3. 最小生成树 kruskal hdu 5723 Abandoned country

    题目链接:hdu 5723 Abandoned country 题目大意:N个点,M条边:先构成一棵最小生成树,然后这个最小生成树上求任意两点之间的路径长度和,并求期望 /************** ...

  4. 01背包 URAL 1073 Square Country

    题目传送门 /* 题意:问n最少能是几个数的平方和 01背包:j*j的土地买不买的问题 详细解释:http://www.cnblogs.com/vongang/archive/2011/10/07/2 ...

  5. 计算机学院大学生程序设计竞赛(2015’12)The Country List

    The Country List Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. HDU 5723 Abandoned country(落后渣国)

    HDU 5723 Abandoned country(落后渣国) Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 ...

  7. HDU 5723 Abandoned country (最小生成树 + dfs)

    Abandoned country 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5723 Description An abandoned coun ...

  8. [转]How to convert IP address to country name

    本文转自:http://www.codeproject.com/Articles/28363/How-to-convert-IP-address-to-country-name   Download ...

  9. Zoj3332-Strange Country II(有向竞赛图)

    You want to visit a strange country. There are n cities in the country. Cities are numbered from 1 t ...

  10. ural 1698. Square Country 5(记忆化搜索)

    1698. Square Country 5 Time limit: 2.0 secondMemory limit: 64 MB The first arithmetical operation ta ...

随机推荐

  1. Android中滑屏实现----触摸滑屏以及Scroller类详解 .

    转:http://blog.csdn.net/qinjuning/article/details/7419207 知识点一:  关于scrollTo()和scrollBy()以及偏移坐标的设置/取值问 ...

  2. P2004 领地选择

    P2004 领地选择 题目描述 作为在虚拟世界里统帅千军万马的领袖,小Z认为天时.地利.人和三者是缺一不可的,所以,谨慎地选择首都的位置对于小T来说是非常重要的. 首都被认为是一个占地C*C的正方形. ...

  3. ionic:目录

    ylbtech-ionic:目录 1.返回顶部 1. http://www.runoob.com/ionic/ionic-tutorial.html 2. 2.返回顶部   3.返回顶部   4.返回 ...

  4. 10.2 External interrupt/event controller (EXTI)

    EXTI控制器的主要特点如下: 每个中断/事件线上的独立触发器和掩码 每个中断行的专用状态位 生成最多20个软件事件/中断请求 脉冲宽度小于APB2时钟周期的外部信号检测. 每条中断线路的专用状态位生 ...

  5. LeetCode刷题笔记-递归-将有序数组转换为二叉搜索树

    题目描述 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10, ...

  6. 2019 IEEEXtreme 13.0 Impact Factor 影响因子

    Impact Factor 题目大意 顾名思义,求影响因子.有 n 行 json 数据,第一行为期刊信息,后面为出版商出版的文章信息.   输入输出 点击查看详细 输入: 6 {"publi ...

  7. this.$router.go()和this.$router.push()的差别

    1.this.$router.go(val) => 在history记录中前进或者后退val步,当val为0时刷新当前页面. 2.this.$router.push(path) => 在h ...

  8. 零基础入门学习python--第一章

    知识点汇总1. Python的应用范围:操作系统.3D动画.WEB.企业应用.云计算等.2. Python是什么类型的语言?脚本语言,即电脑编程语言,比C.C++或java之类的系统编程语言简单容易. ...

  9. POJ 2763 /// 基于边权的树链剖分

    题目大意: 给定n个结点,有n-1条无向边,给定每条边的边权 两种操作,第一种:求任意两点之间路径的权值和,第二种:修改树上一点的权值. 因为是一棵树,可以直接把 u点和v点间(假设u为父节点,v为子 ...

  10. C#下面的次幂表达

    嗯,一个错误.不能用x^y表达,要用math.pow(x,y).