5104 I-country
5104 I-country
在 N*M 的矩阵中,每个格子有一个权值,要求寻找一个包含 K 个格子的凸连通块(连通块中间没有空缺,并且轮廓是凸的,如书中图片所示),使这个连通块中的格子的权值和最大。求出这个最大的权值和,并给出连通块的具体方案。本题有SPJ,输出任意一种方案即可。N,M≤15,K≤225。
- 用f[i,j,l,r,x,y]表示前i行选择了j个格子,其中第i行选择了第l到第r个格子(若不选则均为0),左边界的单调类型为X,右边界的单调类型为y(0表示递增,1表示递减)时,能构成的凸联通快的最大权值和。
- 状态转移:借用大佬博客:
1.左边界列号递减,右边界列号递增(两边界都处于扩张状态)
f[i,j,l,r,1,0] = A[i][r]-A[i][l] + max{f[i-1,j-(r-l+1),p,q,1,0]};//j>r-l+1>0
= A[i][r]-A[i][l] + max{f[i-1,0,0,0,1,0]};//j=r-l+1>0
2.左右边界列号都递减(左边界扩张,右边界收缩)
f[i,j,l,r,1,1] = A[i][r]-A[i][l] + max{max{f[i-1,j-(r-l+1),p,q,1,y]}(0<=y<=1)}
3.左右边界列号都递减(左边界收缩,右边界扩张)
f[i,j,l,r,0,0] = A[i][r]-A[i][l] + max{{f[i-1,j-(r-l+1),p,q,x,0](0<=x<=1)}}
4.左边界列号递增,右边界列号递减(两边界都处于收缩状态)
f[i,j,l,r,0,1] = A[i][r]-A[i][l] + max{max{max{f[i-1,j-(r-l+1),p,q,x,y]}(0<=y<=1)}(0<=x<=1)}(p<=l<=r<=q)
对于2,3,4的max嵌套max,可能有点难以理解
我们来想一下,我们要进行收缩,那么我们这个收缩的状态是怎么得来的?
答:由上一行扩张或收缩而来
所以当收缩右边界时,我们先比较的是上一行右边界标记扩张和右边界标记收缩的最大值,再和当前行比较
左边界收缩时同理。
这样我们就能推出2和3。
进而我们想4这种情况。
左右边界同时进行收缩,我们就要嵌套3次,先由上述确定右边界状态,再由已确定右边界状态来确定左边界状态,最后由已确定的左边界状态和右边界状态来确定当前行
//此处状态单指标记为收缩或扩张,即上一行的左/右边界由上上一行的左/右边界扩张或收缩得到本题还要求输出方案。
在动态规划需要给出方案时,通常做法是额外使用一些与DP状态大小相同的数组记录下来每个状态,通过递归返回最初的状态,然后逐层退出的同时输出方案代码:
#include <cstdio>
#include <cstring>
#include <cctype> template <typename T>
inline T max(T a,T b){
return a>b ? a : b;
}
template <typename T>
inline T min(T a,T b){
return a<b ? a : b;
}
template <typename T>
inline void read(T &x)
{
x=;
int p=; char ch=getchar();
while(!isdigit(ch)&&ch!='-') if(ch=='-') p=-,ch=getchar(); while(isdigit(ch)) x=(x<<)+(x<<)+(ch-''),ch=getchar();
x=p*x;
} int n,m,k;
int a[][];
int sum[][];
int i,j,l,r,x,y;
int f[][][][][][];
struct method{
int l,r,x,y;
}met[][][][][][]; inline void update(int dat,int nl,int nr,int nx,int ny)
{
int &a=f[i][j][l][r][x][y];
if(dat<=a) return ;
method &p=met[i][j][l][r][x][y];
a=dat;
p=method{nl,nr,nx,ny};
} void print(int i,int j,int l,int r,int x,int y)
{
if(j<=) return;
method &p=met[i][j][l][r][x][y];
// printf("%d\n",j);
print(i-,j-(r-l+),p.l,p.r,p.x,p.y); for(int s=l ; s<=r ; s++)
printf("%d %d\n",i,s);
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(i= ; i<=n ; i++)
for(j= ; j<=m ; j++) scanf("%d",&a[i][j]),sum[i][j]=sum[i][j-]+a[i][j]; for(i= ; i<=n ; i++)
for(j= ; j<=k ; j++)
for(l= ; l<=m ; l++)
for(r=l ; r<=m ; r++)
{
int t=r-l+;
int now=sum[i][r]-sum[i][l-];
if(t>j) break;
//左减右增
x=,y=;
for(int p=l ; p<=r ; p++)
for(int q=p ; q<=r ; q++)
{
update(f[i-][j-t][p][q][][]+now,p,q,,);
}
//左减右减
x=,y=;
for(int p=l ; p<=r ; p++)
for(int q=r ; q<=m ; q++)
{
update(f[i-][j-t][p][q][][]+now,p,q,,);
update(f[i-][j-t][p][q][][]+now,p,q,,);
}
//左增右增
x=,y=;
for(int p= ; p<=l ; p++)
for(int q=l ; q<=r ; q++)
{
update(f[i-][j-t][p][q][][]+now,p,q,,);
update(f[i-][j-t][p][q][][]+now,p,q,,);
}
//左增右减
x=,y=;
for(int p= ; p<=l ; p++)
for(int q=r ; q<=m ; q++)
{
update(f[i-][j-t][p][q][][]+now,p,q,,);
update(f[i-][j-t][p][q][][]+now,p,q,,);
update(f[i-][j-t][p][q][][]+now,p,q,,);
update(f[i-][j-t][p][q][][]+now,p,q,,);
}
}
int ans=;
int ai,al,ar,ax,ay;
for(i= ; i<=n ; i++)
for(l= ; l<=m ; l++)
for(r=l ; r<=m ; r++)
for(x= ; x<= ; x++)
for(y= ; y<= ; y++)
{
if(f[i][k][l][r][x][y]>ans)
{
ans=f[i][k][l][r][x][y];
ai=i,al=l,ar=r,ax=x,ay=y;
}
}
printf("Oil : %d\n",ans);
print(ai,k,al,ar,ax,ay);
return ;
}
5104 I-country的更多相关文章
- wifi的country code
转自:http://userpage.chemie.fu-berlin.de/diverse/doc/ISO_3166.htmlCountry A 2 A 3 Number ------------- ...
- hdu 5104 素数打表水题
http://acm.hdu.edu.cn/showproblem.php?pid=5104 找元组数量,满足p1<=p2<=p3且p1+p2+p3=n且都是素数 不用素数打表都能过,数据 ...
- ural 1073. Square Country
1073. Square Country Time limit: 1.0 secondMemory limit: 64 MB There live square people in a square ...
- 最小生成树 kruskal hdu 5723 Abandoned country
题目链接:hdu 5723 Abandoned country 题目大意:N个点,M条边:先构成一棵最小生成树,然后这个最小生成树上求任意两点之间的路径长度和,并求期望 /************** ...
- 01背包 URAL 1073 Square Country
题目传送门 /* 题意:问n最少能是几个数的平方和 01背包:j*j的土地买不买的问题 详细解释:http://www.cnblogs.com/vongang/archive/2011/10/07/2 ...
- 计算机学院大学生程序设计竞赛(2015’12)The Country List
The Country List Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 5723 Abandoned country(落后渣国)
HDU 5723 Abandoned country(落后渣国) Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 ...
- hduacm 5104
http://acm.hdu.edu.cn/show #include <cstdio> #include <cstring> #include <algorithm&g ...
- hdu 5104 Primes Problem
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5104 Primes Problem Description Given a number n, ple ...
- HDU 5723 Abandoned country (最小生成树 + dfs)
Abandoned country 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5723 Description An abandoned coun ...
随机推荐
- Python一行代码搞定的事情
python -m SimpleHTTPServer 8000 http://127.0.0.1:8000/ 有了这一行代码分享本地盘内容就不需要FTP了. pydoc:Python文档工具 pyth ...
- Python简单邮件发送源码
环境: Python27 主要代码: # -*- coding: utf-8 -*- ''' Created on 2016年10月18日 @author: xuxianglin ''' import ...
- eclipse添加web项目报错“Target runtime Apache Tomcat v7.0 is not defined.”
项目检出后,发现是Tomcat7 发布的,修改文件: 工作空间--->项目名称--->.settings--->org.eclipse.wst.common.project.face ...
- code1796 社交网络
输入描述 Input Description 输入文件中第一行有两个整数,n 和 m,表示社交网络中结点和无向边的数 目.在无向图中,我们将所有结点从 1 到 n 进行编号. 接下来 m 行,每行用三 ...
- PHP发红包程序限制红包的大小
我们先来分析下规律. 设定总金额为10元,有N个人随机领取: N=1 第一个 则红包金额=X元: N=2 第二个 为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数. 第 ...
- Java设计模式(2)——工厂方法模式
工厂方法模式同样属于类的创建型模式又被称为多态工厂模式.工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色, ...
- ThinkPhp 生成静态页面
//开启静态缓存'HTML_CACHE_ON' => true, //开启缓存'HTML_CACHE_TIME' =>60, //开启缓存时间'HTML_FILE_SUFFIX' => ...
- 部分类Partial
Partial告诉编译器,一个类,结构,接口的定义源代码可能要分散到一个或者多个源文件中. 在下面的情况下用Partial类型: (1) 类型特别大,不宜放在一个文件中实现.(2) 一个类型中的一部分 ...
- JAVA 异常分类与理解
摘自CSDN:::::http://blog.csdn.net/hguisu/article/details/6155636 1. 引子 try…catch…finally恐怕是大家再熟悉不过的语句了 ...
- nodejs版本升级
网上都说 npm install –g n 可是一直不行,换做 npm install -g cnpm --registry=https://registry.npm.taobao.org ok