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. A1075 PAT Judge (25 分)

    The ranklist of PAT is generated from the status list, which shows the scores of the submissions. Th ...

  2. JAVA泛型知识(一)

    Java泛型知识(二)<? extends T>和<? super T> Java1.5泛型指南中文版(Java1.5 Generic Tutorial) 目        录 ...

  3. 20130317 如何批量把文件名称写入txt文档

    1.如何批量把文件名称写入txt文档 COMMAND 窗口例:存放图片的文件夹是 D:\123\就用下面一名命令就OKdir d:\123\*.jpg /b > A.TXT 那么你所以JPG格式 ...

  4. sql实现取汉字大写首字母

    )) ) AS BEGIN DECLARE @py TABLE( ch ), hz1 ) COLLATE Chinese_PRC_CS_AS_KS_WS, hz2 ) COLLATE Chinese_ ...

  5. linux下使用自带mail发送邮件

    linux下使用自带mail发送邮件 mailx工具说明: linux可以通过安装mailx工具,mailx是一个小型的邮件发送程序,一般可以通过该程序在linux系统上,进行监控linux系统状态并 ...

  6. echarts数据变了不重新渲染,以及重新渲染了前后数据会重叠渲染的问题

    1.echarts数据变了但是视图不重新渲染 新建Chart.vue文件 <template>  <p :id="id" :style="style&q ...

  7. 随笔记录 linux命令 2019.7.29

    系统命令 一. type   查看命令是内部命令还是内部命令 help   帮助 man   在线帮助 cd      切换目录 pwd    查看所在路径 stat     查看文件详细信息 ls  ...

  8. Python|读、写Excel文件(三种模块三种方式)

    python读写excel的方式有很多,不同的模块在读写的讲法上稍有区别: 用xlrd和xlwt进行excel读写: 用openpyxl进行excel读写: 用pandas进行excel读写: imp ...

  9. vue 兄弟组件的传值

    handleLetterClick方法,采用emit 传递给父组件 父组件触发的方法: handleLetterChange方法: 父组件传递给子组件: CityList组件:   兄弟组件的传值可以 ...

  10. Java 巴什博弈(取石子报数问题)

    巴什博弈:有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜.   规律:如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一 ...