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. [JZOJ 5697] 农场

    题目大意:将 n 个数 ai分成若干连续的段,使得每段的和都相等,求最多可以分成多少段. 思路: 考虑ai的和为sum,那么每一段的和就是约数. 对于每一个d,考虑其是否合法. 1e6之内用桶统计不会 ...

  2. (转)Java安全通信:HTTPS与SSL

    转:http://www.cnblogs.com/devinzhang/archive/2012/02/28/2371631.html 1. HTTPS概念 1)简介 HTTPS(全称:Hyperte ...

  3. Codeforces 1167D - Bicolored RBS

    题目链接:http://codeforces.com/problemset/problem/1167/D 题意:题目定义RBS,给你一个字符串,你要对其所有字符染色,使之分解为俩个RBS,使俩个RBS ...

  4. Android Telephony分析(二) ---- RegistrantList详解

    前言 本文主要讲解RegistrantList的原理,以及如何快速分析RegistrantList相关的代码流程.在Telephony模块中,在RIL.Tracker(ServiceStateTrac ...

  5. spring boot 结合jsp简单示例

    引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...

  6. codis 使用

    1:Jedis与Redisson对比 2.1. 概况对比 Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持:Redisson实现了分布式和可扩展的Java数据 ...

  7. 一些CSS3新技术

    前些日子在SmashingMagazine看到一篇关于CSS3新技术不错的文章,它详细介绍了CSS3的新特性和它的使用方法,它包括:浏览器专有属性.选择器(属性选择器.连字符.伪类.伪元素).RGBA ...

  8. Python编程从入门到实践

    Python编程从入门到实践1 起步2 变量和简单数据类型3 列表简介4 操作列表5 if语句6 字典7 用户输入和while循环8 函数9 类10 文件和异常11 测试代码12 武装飞船13 外星人 ...

  9. JQuery,JS图片操作(上一张,下一张,旋转,放大,缩小)

    1.html代码:我是从数据库获取图片路径. <div id="divprint" align="center"> @{DataTable dt = ...

  10. innodb_file_per_table 理解

    MYSQL innodb存储引擎 默认将所有的数据库 innodb 引擎的表数据存储在一个共享空间中:ibdata1,当增删数据库的时候, ibdata1文件不会自动收缩,单个数据库的备份也会成为问题 ...