【CH5104】I-country 线性dp+路径输出
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+路径输出的更多相关文章
- 【洛谷P1854】花店橱窗 线性dp+路径输出
题目大意:给定 N 个数字,编号分别从 1 - N,M 个位置,N 个数字按照相对大小顺序放在 M 个位置里,每个数放在每个位置上有一个对答案的贡献值,求一种摆放方式使得贡献值最大. 题解:一道典型的 ...
- P1052 过河 线性dp 路径压缩
题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...
- 选课 树形dp+路径输出
#include<iostream> #include<cstdio> #include<cstring> #define maxn 2010 using name ...
- AcWing 313. 花店橱窗 (线性DP)打卡
题目:https://www.acwing.com/problem/content/315/ 题意:有一个矩阵,你需要在每一行选择一个数,必须保证前一行的数的下标选择在下一行的左边,即下标有单调性,然 ...
- 机器分配----线性dp难题(对于我来说)
题目: 总公司拥有高效设备M台, 准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值.其中M <= 15, ...
- 【线性DP】数字三角形
题目链接 原题链接 题目描述 给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大. 7 3 ...
- DP+路径 URAL 1029 Ministry
题目传送门 /* 题意:就是从上到下,找到最短路,输出路径 DP+路径:状态转移方程:dp[i][j] = min (dp[i-1][j], dp[i][j-1], dp[i][j+1]) + a[[ ...
- 动态规划——线性dp
我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...
- POJ1015 && UVA - 323 ~Jury Compromise(dp路径)
In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting of ...
随机推荐
- 解决 ln -s 软链接产生的Too many levels of symbolic links错误
参考: ln -s 软链接产生Too many levels of symbolic links错误 解决 ln -s 软链接产生的Too many levels of symbolic links错 ...
- Foxmail7.2新建的文件夹不见了
Foxmail在客户端上,新建了几个文件夹,并把相应的邮件都都选择了“总是把**邮件转移到”这个选项. 今天早上打开电脑一看,所有的邮件连同对应的文件夹都找不到了 Foxmail中没显示因为默认是隐藏 ...
- django使用小结
一.静态文件的使用 二.csrf跨站访问安全机制设置 三.MODEL模型使用
- attr VS prop 区别
attr 能够增加.获取.删除页面属性.从页面中获取属性值: prop 用来获取.删除元素自带属性.从属性对象中获取属性值. attr 只获取静态属性值,就是页面加载时的最初的属性值: prop 可以 ...
- 记一下JavaScript的几种排序算法
零.写在最前 排序的方法有很多种,这篇文章只是记录我熟悉的算法: 我发现了一个关于排序算法很有趣的网站,把相关的算法演示做成了动画,有兴趣的同学可以看看! 附上SortAnimate网站链接:http ...
- logging模块使用
日志介绍 日志级别: 默认显示级别为warning,(critical>error>warning>info>debug>notset) 日志格式配置,测试使用 impo ...
- MapServer Tutorial——MapServer7.2.1教程学习——第一节:MapServer的基本配置管理,静态地图应用以及MapFile文件
MapServer Tutorial——MapServer7.2.1教程学习——第一节:MapServer的基本配置管理,静态地图应用以及MapFile文件 前言 万事开头难,有了<MapSer ...
- gps相关的知识
百度地图开放平台 高德开放平台
- nginx概述
1)nginx的特性: 模块化设计,较好的扩展性 高可靠性 master/worker 支持热部署 不停机更新配置文件,更换日志,更新服务器程序版本 低内存消耗 支持event-driven,alo, ...
- 读取磁盘:LBA方式
LBA简介 磁盘读取发展 IO操作读取硬盘的三种方式: chs方式 :小于8G (8064MB) LBA28方式:小于137GB LBA48方式:小于144,000,000 GB LBA方式访问使用了 ...