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. POJ2516费用流

    目录 目录 (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 目录 题意:传送门 AC代码: #include <iostream> #include <cstdio ...

  2. scrapy爬取cnblogs文章列表

    scrapy爬取cnblogs文章 目标任务 安装爬虫 创建爬虫 编写 items.py 编写 spiders/cnblogs.py 编写 pipelines.py 编写 settings.py 运行 ...

  3. 《DSP using MATLAB》Problem 9.4

    只放第1小题. 代码: %% ------------------------------------------------------------------------ %% Output In ...

  4. jq 出现 $.cookie is not a function

    出现这种问题有3中可能 1是没有导入cookie相关的库文件 2是cookie的库文件和jquery库文件的先后顺序问题, 必须先导入jquery库文件后到其他库文件 3一个页面由于二次或多次引入了j ...

  5. 数组模拟stack

    package com.cxy.springdataredis.data; import java.util.Scanner; public class StackDemo { public stat ...

  6. Docker学习のWindows下如何访问Docker本身的虚拟机

    获取可访问Docker守护程序的容器 docker run --privileged -it -v /var/run/docker.sock:/var/run/docker.sock jongalla ...

  7. C#中,用户控件UserControl里面用Panl加载UserControl,并实现利用委托互相传值

    用户控件主窗体结构:左侧树形菜单,右侧Panl: 根据点击的菜单节点,panl里面选择性加载某一个子窗体用户控件,并传值给子窗体: 反之,在子窗体进行相应的操作之后,传值给主窗体,触发主窗体的刷新. ...

  8. c# 使用Expression 生成sql

    使用Expression 生成sql  update语句的时候遇到了个问题 ,Expression<Action<T>>  la   这个委托里面老获取不到 引用类型的值,甚至 ...

  9. python open函数关于w+ r+ 读写操作的理解(转)

    r 只能读 (带r的文件必须先存在)r+ 可读可写 不会创建不存在的文件.如果直接写文件,则从顶部开始写,覆盖之前此位置的内容,如果先读后写,则会在文件最后追加内容.w+ 可读可写 如果文件存在 则覆 ...

  10. Android开发 解决Installation failed due to XXX 问题

    报错信息 Android studio 安装app的时候以下报错 Installation did not succeed. The application could not be installe ...