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 ...
随机推荐
- 通过Scanner从控制台获取数据
----------siwuxie095 Scanner类用于扫描从控制台输入的数据,可以接收字符串和基本数据类型的数据 Scanner类位于 java.util.Scanner 包中 Scanner ...
- spring4-2-bean配置-2-属性注入细节
配置 bean,本章节中主要介绍蓝色文字部分. 配置形式:基于 XML 文件的方式:基于注解的方式 Bean 的配置方式:通过全类名(反射).通过工厂方法(静态工厂方法 & 实例工厂方法).F ...
- 万能头文件#include<bits/stdc++.h>
最近在打cf时赛后翻阅别人的代码总是会发现一个陌生而奇怪的头文件#include<bits/stdc++.h> 奇怪之处就在于基本上所有的代码只要用了这个头文件就不再写其他头文件了. 百度 ...
- c#服务器端控件confirm
1>服务器端控件删除的数据的时候,可以调用js的confirm防止误操作,但是默认的样式实在是让人难以接受,怎么调用自定义的提示框而且同步回发到服务器端, 服务器端的控件的用linkbutton ...
- 面向对象的JavaScript-008-Function介绍
1. // 函数 /* Declare the function 'myFunc' */ function myFunc(theObject) { theObject.brand = "To ...
- Python之FTP传输-乾颐堂
访问FTP,无非两件事情:upload和download,最近在项目中需要从ftp下载大量文件,然后我就试着去实验自己的ftp操作类,如下(PS:此段有问题,别复制使用,可以参考去试验自己的ftp类! ...
- Java Persistence with MyBatis 3(中文版) 第一章 MyBatis入门
本章将涵盖以下话题: ž MyBatis是什么? ž 为什么选择MyBatis? ž MyBatis安装配置 ž 域模型样例 1.1 MyBatis是什么 MyBatis是一个简化和实现了Ja ...
- Unknown column 'sid' in 'field list'
不知道sid命名的列,这是这个错误的提示 比对配置文件,看起实体跟数据库表的对应是否,然后查看找到问题是查找语句中的表名字,跟数据库中的表名不是一个名字.
- 优秀前端工程师必备: (总结) 清除原生ios按钮样式
写移动端的web开发时, 需要清除IOS本身的各种样式: 1.消除ios按钮原生样式, 给按钮加自定义样式: input[type="button"], input[type=&q ...
- C#结构(Struct)
Struct简介: 结构是使用 struct 关键字定义的,与类相似,都表示可以包含数据成员和函数成员的数据结构. 1.结构是一种值类型,并且不需要堆分配. 它都放在堆栈上2.结构的实例化可以不使用 ...