pre:在网格中,凸多边形可以按行(row)分解成若干段连续的区间 [ l , r ] ,且左端点纵坐标的值(col)满足先减后增,右端点纵坐标先增后减。

阶段:根据这个小发现,可以将阶段设置成每一行,因此,解决这个问题一共需要N个阶段。

状态:除了阶段外,表示每一个状态还需要记录下当前阶段下一共选了多少个网格,当前行选择的区间 [ l , r ] ,和相对于上一行来说端点选择的单调性。(0表示单调递增,1表示单调递减)

因此,状态可以表示成为\(dp[i][j][l][r][x][y]\)

状态转移方程:分成四种情况进行讨论,详见代码。

第二个要实现的是路径输出,可以额外使用与状态大小相同的数组来记录下当前状态是从哪个状态转移而来的,最后从末状态经过一次递归即可得到路径。

代码如下

#include <bits/stdc++.h>
#define forto(i,a,b) for(i=a;i<=b;i++)//循环宏定义,减小代码量
using namespace std; int n,m,k,sum[20][20];
int f[16][226][16][16][2][2];
struct node{
int l,r,x,y;
}pre[16][226][16][16][2][2]; void read_and_parse(){
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
scanf("%d",&sum[i][j]);
sum[i][j]+=sum[i][j-1];
}
} int x,y,i,j,l,r,ans,ai,al,ar,ax,ay;//本题状态数较多,因此采用当前变量全局化,避免参数传递混乱 inline void update(int dat,int L,int R,int X,int Y){
int& ans=f[i][j][l][r][x][y];//使用引用减小代码量
node& p=pre[i][j][l][r][x][y];
if(ans>=dat)return;
ans=dat;
p=(node){L,R,X,Y};
} void print(int i,int j,int l,int r,int x,int y){
if(!j)return;
node& p=pre[i][j][l][r][x][y];
print(i-1,j-(r-l+1),p.l,p.r,p.x,p.y);
forto(j,l,r)printf("%d %d\n",i,j);
} void solve(){
forto(i,1,n)forto(j,1,k)forto(l,1,m)forto(r,l,m){
int t=r-l+1;if(t>j)break;
int now=sum[i][r]-sum[i][l-1];
x=y=1;
for(int p=l;p<=r;p++)
for(int q=r;q<=m;q++){
update(f[i-1][j-t][p][q][1][0]+now,p,q,1,0);
update(f[i-1][j-t][p][q][1][1]+now,p,q,1,1);
}
x=1,y=0;
for(int p=l;p<=r;p++)
for(int q=p;q<=r;q++)
update(f[i-1][j-t][p][q][1][0]+now,p,q,1,0);
x=0,y=1;
for(int p=1;p<=l;p++)
for(int q=r;q<=m;q++){
update(f[i-1][j-t][p][q][1][1]+now,p,q,1,1);
update(f[i-1][j-t][p][q][1][0]+now,p,q,1,0);
update(f[i-1][j-t][p][q][0][1]+now,p,q,0,1);
update(f[i-1][j-t][p][q][0][0]+now,p,q,0,0);
}
x=y=0;
for(int p=1;p<=l;p++)
for(int q=l;q<=r;q++){
update(f[i-1][j-t][p][q][1][0]+now,p,q,1,0);
update(f[i-1][j-t][p][q][0][0]+now,p,q,0,0);
}
}
forto(i,1,n)forto(l,1,m)forto(r,l,m)forto(x,0,1)forto(y,0,1)
if(ans<f[i][k][l][r][x][y]){
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);//传入终点状态参数
} int main(){
read_and_parse();
solve();
return 0;
}

【CH5104】I-country 线性dp+路径输出的更多相关文章

  1. 【洛谷P1854】花店橱窗 线性dp+路径输出

    题目大意:给定 N 个数字,编号分别从 1 - N,M 个位置,N 个数字按照相对大小顺序放在 M 个位置里,每个数放在每个位置上有一个对答案的贡献值,求一种摆放方式使得贡献值最大. 题解:一道典型的 ...

  2. P1052 过河 线性dp 路径压缩

    题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...

  3. 选课 树形dp+路径输出

    #include<iostream> #include<cstdio> #include<cstring> #define maxn 2010 using name ...

  4. AcWing 313. 花店橱窗 (线性DP)打卡

    题目:https://www.acwing.com/problem/content/315/ 题意:有一个矩阵,你需要在每一行选择一个数,必须保证前一行的数的下标选择在下一行的左边,即下标有单调性,然 ...

  5. 机器分配----线性dp难题(对于我来说)

    题目: 总公司拥有高效设备M台, 准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值.其中M <= 15, ...

  6. 【线性DP】数字三角形

    题目链接 原题链接 题目描述 给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大. 7 3 ...

  7. DP+路径 URAL 1029 Ministry

    题目传送门 /* 题意:就是从上到下,找到最短路,输出路径 DP+路径:状态转移方程:dp[i][j] = min (dp[i-1][j], dp[i][j-1], dp[i][j+1]) + a[[ ...

  8. 动态规划——线性dp

    我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...

  9. POJ1015 && UVA - 323 ~Jury Compromise(dp路径)

    In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting of ...

随机推荐

  1. 【SMTP】常见错误码

    '* 邮件服务返回代码含义 '* 500 格式错误,命令不可识别(此错误也包括命令行过长) '* 501 参数格式错误 '* 502 命令不可实现 '* 503 错误的命令序列 '* 504 命令参数 ...

  2. MapReduce 踩坑 - hadoop No FileSystem for scheme: file/hdfs

    一.场景 hadoop-3.0.2 + hbase-2.0.0 一个mapreduce任务,在IDEA下本地提交到hadoop集群可以正常运行. 现在需要将IDEA本地项目通过maven打成jar包, ...

  3. MySQL 5.6容器使用自定义配置文件的权限问题

    提出问题: 在使用Rancher2.0.2部署一个mysql deployment时,我们会发现,如果只设置/var/lib/mysql数据目录时,mysql容器(pod)能够正常启动,一旦数据目录和 ...

  4. 了解多层交换中的CEF FIB CAM TCAM

    来源:http://blog.51cto.com/redant/314151 多层交换是指交换机使用硬件来交换和路由数据包,通过硬件来支持4-7层的交换.交换机执行硬件交换,第3层引擎(路由处理器)须 ...

  5. JS正则表达式分组模式

    分组的概念 分组就是在正则表达式中用()包起来的内容代表了一个分组,如下: var reg=/([0-9]{3})([a-z]{2})/ var str="123ab" conso ...

  6. vue中关于v-for性能优化---track-by属性

    vue中关于v-for性能优化---track-by属性 最近看了一些react,angular,Vue三者的对比文章,对比来说Vue比较突出的是轻量级与易上手. 对比Vue与angular,Vue有 ...

  7. WebSphere,WebLogic,Tomcat,IIS

    Weblogic.Tomcat 都基于java的基础架构 Weblogic是一个企业级的应用服务器,其中包括j2ee中的各类应用如jsp,servlet,ejb等, Tomcat是一个初级的应用服务器 ...

  8. mysql装完计算机管理里面没mysql服务怎么解决(转)

    mysql装完计算机管理里面没mysql服务怎么解决 2017年07月04日 09:32:51 XC_Echizen 阅读数:7335 标签: mysql计算机mysql服务找不到mysql服务 更多 ...

  9. 用mybatis中的insert方法插入数据,返回值为1,但数据库却没有数据

    刚才在写东西的时候,用mybatis中的 <insert id="add" parameterType="cn.entity.Computer"> ...

  10. jquery常用实例

    $("#returnTop").click(function () { var speed=200;//滑动的速度 $('body,html').animate({ scrollT ...