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的更多相关文章

  1. wifi的country code

    转自:http://userpage.chemie.fu-berlin.de/diverse/doc/ISO_3166.htmlCountry A 2 A 3 Number ------------- ...

  2. hdu 5104 素数打表水题

    http://acm.hdu.edu.cn/showproblem.php?pid=5104 找元组数量,满足p1<=p2<=p3且p1+p2+p3=n且都是素数 不用素数打表都能过,数据 ...

  3. ural 1073. Square Country

    1073. Square Country Time limit: 1.0 secondMemory limit: 64 MB There live square people in a square ...

  4. 最小生成树 kruskal hdu 5723 Abandoned country

    题目链接:hdu 5723 Abandoned country 题目大意:N个点,M条边:先构成一棵最小生成树,然后这个最小生成树上求任意两点之间的路径长度和,并求期望 /************** ...

  5. 01背包 URAL 1073 Square Country

    题目传送门 /* 题意:问n最少能是几个数的平方和 01背包:j*j的土地买不买的问题 详细解释:http://www.cnblogs.com/vongang/archive/2011/10/07/2 ...

  6. 计算机学院大学生程序设计竞赛(2015’12)The Country List

    The Country List Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. HDU 5723 Abandoned country(落后渣国)

    HDU 5723 Abandoned country(落后渣国) Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 ...

  8. hduacm 5104

    http://acm.hdu.edu.cn/show #include <cstdio> #include <cstring> #include <algorithm&g ...

  9. hdu 5104 Primes Problem

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5104 Primes Problem Description Given a number n, ple ...

  10. HDU 5723 Abandoned country (最小生成树 + dfs)

    Abandoned country 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5723 Description An abandoned coun ...

随机推荐

  1. redis 面试题1 有用

    1.什么是redis? Redis 是一个基于内存的高性能key-value数据库. 2.Reids的特点 Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库 ...

  2. jquery简单ajax示例_读取json文件数据

    来自于<jquery权威指南> -------------------------------------- 点击button后,获取到json文件数据,显示如下: Json文件: [ { ...

  3. python实现高效率的排列组合算法-乾颐堂

    组合算法 本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标 代表的数被选中,为0则没选中. 首先初始化,将数组前n个元素置1,表示第一个组合为前n个数. 然后从左到右扫描数组 ...

  4. Python使用signal模块实现定时执行

    在liunx系统中要想每隔一分钟执行一个命令,最普遍的方法就是crontab了,如果不想使用crontab,经同事指点在程序中可以用定时器实现这种功能,于是就开始摸索了,发现需要一些信号的知识... ...

  5. console对象的理解

    console对象代表浏览器的JS控制台,虽然不是标准,但已经成为事实的标准 console对象的作用 a.显示代码运行错误信息 b.提供一个命令行接口,用来与网页互动 console对象拥有很多方法 ...

  6. 扩展JPA方法,重写save方法

    为什么要重构save? jpa提供的save方法会将原有数据置为null,而大多数情况下我们只希望跟新自己传入的参数,所以便有了重写或者新增一个save方法. 本着解决这个问题,网上搜了很多解决方案, ...

  7. 一起做RGB-D SLAM (4)

    第四讲 点云拼接 广告:“一起做”系列的代码网址:https://github.com/gaoxiang12/rgbd-slam-tutorial-gx 当博客更新时代码也会随着更新. SLAM技术交 ...

  8. Qt编译,imp_CommandLineToArgvW@8问题

    Tested msvc2013. The linker can not find _imp_CommandLineToArgvW@8. It's in shell32.lib. I see qtmai ...

  9. Gym 101190H Hard Refactoring (模拟坑题)

    题意:给定 n 个区间,让你进行合并,问你最后的区间是,如果是空集,输出 false 如果区间是是 [-32768,32767] ,则是true. 析:进行区间合并,要注意,如果是 x >= 0 ...

  10. Eclipse 调试 NodeJS

    插件地址   http://chromedevtools.googlecode.com/svn/update/dev/ 博客地址 http://www.cnblogs.com/QLeelulu/arc ...