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. springboot + ajax + mybatis 实现批量删除

    实现思路: 1. checkbox全选获取批量删除的id数组 2. ajax以字符串的形式将id数组传给控制器 3. 控制器将字符串分割成List数组作为参数传给mapper 具体代码: 1. 前端代 ...

  2. !important的用法及作用

    定义及语法 !important,作用是提高指定样式规则的应用优先权(优先级).语法格式{ cssRule !important },即写在定义的最后面,例如:box{color:red !impor ...

  3. 将sparkStreaming的结果保存到S3

    将spark解析的结果保存到S3 这个和保存到本地的区别在于,你需要配置aws的key和密码,以及它的region,代码如下 package com.alo7.spark import java.ut ...

  4. mysql 09章_存储过程和函数

    一. 函数和存储过程的相同点: 函数和存储过程都是事先预编译并保存在数据库中的特殊的数据库对象, 需要执行相应功能时就可以直接通过“函数名”.“存储过程”调用其中的代码,以提高执行效率和代码的复用性. ...

  5. Win32SDK应用程序

    转自:https://blog.csdn.net/jxf_ioriyagami/article/details/1486626 1 说在前面    由于VC6及MFC的特点,我们许多人从标准C++学习 ...

  6. webpakc4.0移除了 CommonsChunkPlugin 组建

    在4.0之前我们可以通过 require('webpack.optimize.CommonsChunkPlugin');  这样引入 CommonsChunkPlugin  组建对第三方模块进行独立打 ...

  7. C++之constexpr

    一.常量表达式:是指值不会改变并且在编译过程就能得到计算结果的表达式.一个对象是不是常量表达式是由它的数据类型和初始值共同决定. ;//虽然初始值是字面值常量,但是它的数据类型只是普通int. con ...

  8. Caused by: android.view.InflateException: Binary XML file line #18: Binary XML file line #18: Error inflating class android.widget.CheckedTextView

    困扰了我一天啊 终于吧 这个大bug  给解决掉了 可能是 当时懵逼了  竟然忘记重新构造了!!尴尬了 直接把项目的 build  文件删除重新构造了一边!!

  9. [转]SpringMVC框架入门配置 IDEA下搭建Maven项目

    初衷:本人初学SpringMVC的时候遇到各种稀奇古怪的问题,网上各种技术论坛上的帖子又参差不齐,难以一步到位达到配置好的效果,这里我将我配置的总结写到这里供大家初学SpringMVC的同僚们共同学习 ...

  10. 【luoguP3868】猜数字

    description 现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n ...