10.27T2 线性DP+拆分
2.树塔
(tower)
【问题描述】
相信大家都在长训班学过树塔问题,题目很简单求最大化一个三角形数塔从上往下走的路径和。走的规则是:(i,j)号点只能走向(i+1,j)或者(i+1,j+1)。如下图是一个数塔,映射到该数塔上行走的规则为:从左上角的点开始,向下走或向右下走直到最底层结束。
1
3 8
2 5 0
1 4 3 8
1 4 2 5 0
路径最大和是1+8+5+4+4 = 22,1+8+5+3+5 = 22或者1+8+0+8+5 = 22。
小S觉得这个问题so easy。于是他提高了点难度,他每次ban掉一个点(即规定哪个点不能经过),然后询问你不走该点的最大路径和。
当然他上一个询问被ban掉的点过一个询问会恢复(即每次他在原图的基础上ban掉一个点,而不是永久化的修改)。
【输入】
第一行包括两个正整数N,M,分别表示数塔的高和询问次数。
以下N行,第i行包括用空格隔开的i-1个数,描述一个高为N的数塔。
而后M行,每行包括两个数X,Y,表示第X行第Y列的数塔上的点被小S ban掉,无法通行。
由于读入数据较大,c或c++请使用较为快速的读入方式。
【输出】
M行每行包括一个非负整数,表示在原图的基础上ban掉一个点后的最大路径和,如果被ban掉后不存在任意一条路径,则输出-1。
【输入输出样例】
tower.in |
tower.out |
5 3 1 3 8 2 5 0 1 4 3 8 1 4 2 5 0 2 2 5 4 1 1 |
17 22 -1 |
【样例解释】
第一次是13 X2 5 01 4 3 81 4 2 5 01+3+5+4+4 = 17 或者 1+3+5+3+5=17第二次:13 82 5 01 4 3 81 4 2 X 01+8+5+4+4 = 22第三次:你们都懂的!无法通行,-1!
【数据规模和约定】
所有测试数据范围和特点如下:
对于所有数据,数塔中的数X的大小满足0≤X≤106
测试点编号 |
N |
M |
特殊约定 |
1 |
≤ 5 |
≤ 3 |
|
2 |
|||
3 |
≤ 105 |
||
4 |
|||
5 |
≤ 50 |
≤ 103 |
满足点(i,j)上的数=i*j |
6 |
|||
7 |
|||
8 |
|||
9 |
≤ 300 |
≤ 104 |
数塔中所有数相等 |
10 |
|||
11 |
|||
12 |
|||
13 |
≤ 1000 |
≤ 3*105 |
满足点(i,j)上的数=i-j |
14 |
满足点(i,j)上的数=i*j |
||
15 |
数塔中所有数相等 |
||
16 |
|||
17 |
|||
18 |
5*105 |
满足点(i,j)上的数=i-j |
|
19 |
|||
20 |
这题我SB了,本应想到前后缀DP是可行的,但是我一直卡在去掉数字的影响导致65pt
考虑求出每一个位置从上到下的最大值和从小到大的最大值,枚举去掉的那一行的前后缀和的最大值就可以了
暴力其实可以拿80但是我分段分的不好
code:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 long long a[1005][1005],suf[1005][1005],pre[1005][1005]; 5 long long read(){ 6 long long x=0,f=1;char c=getchar(); 7 while(!isdigit(c)){if(c=='-')f=-1;c=getchar();} 8 while(isdigit(c)){x=(x<<3)+(x<<1)+c-'0';c=getchar();} 9 return x*f; 10 } 11 int main() { 12 long long n,m; 13 n=read(),m=read(); 14 for(long long i=1; i<=n; i++) 15 for(long long j=1; j<=i; j++) 16 a[i][j]=read(),suf[i][j]=max(suf[i-1][j],suf[i-1][j-1])+a[i][j]; 17 for(long long i=n; i>=1; i--) 18 for(long long j=1; j<=i; j++) 19 pre[i][j]=max(pre[i+1][j],pre[i+1][j+1])+a[i][j]; 20 for(long long i=1; i<=m; i++) { 21 long long x=read(),y=read(),max0=0; 22 if(x==1&&y==1) {cout<<-1<<'\n';continue;} 23 for(long long j=1; j<=x; j++) { 24 if(j==y)continue; 25 max0=max(max0,pre[x][j]+suf[x][j]-a[x][j]); 26 } 27 cout<<max0<<'\n'; 28 } 29 return 0; 30 }
over
转载于:https://www.cnblogs.com/saionjisekai/p/9860926.html
10.27T2 线性DP+拆分相关推荐
- 0x51.动态规划 - 线性DP(习题详解 × 10)
目录 0x51.动态规划 - 线性DP 0x51.1 LIS问题 Problem A. 登山 (最长下降子序列) Problem B. 友好城市(思维) Problem C. 最大上升子序列和 0x5 ...
- CH 5102 Mobile Service(线性DP)
CH 5102 Mobile Service \(solution:\) 这道题很容易想到DP,因为题目里已经说了要按顺序完成这些请求.所以我们可以线性DP,但是这一题的状态不是很好设,因为数据范围有 ...
- 【动态规划】线性dp P1043 数字游戏
思路: 这题和 [动态规划]P1018 线性dp:乘积最大_m0_52043808的博客-CSDN博客 十分类似,都是把一组数分成固定的部分,然后对分好的数进行特定的操作,求操作后所得的最值 所以,两 ...
- P3842 [TJOI2007]线段(线性dp,分类讨论)
P3842 [TJOI2007]线段 题意 [TJOI2007]线段 题目描述 在一个 n×nn \times nn×n 的平面上,在每一行中有一条线段,第 iii 行的线段的左端点是(i,Li)(i ...
- [nk] 糟糕的打谱员 线性DP
前言 线性DP是世界上最难的算法!!(我在口胡) 前言 : https://ac.nowcoder.com/acm/contest/11215/C 思路 看完该题之后 (问的什么鬼 贪心?排序之后交替 ...
- P1772 [ZJOI2006]物流运输(线性dp+最短路径)
P1772 [ZJOI2006]物流运输 题意 [ZJOI2006]物流运输 题目描述 物流公司要把一批货物从码头 A 运到码头 B.由于货物量比较大,需要 nnn 天才能运完.货物运输过程中一般要转 ...
- 算法模板:动态规划之线性DP【沈七】
算法模板:动态规划之线性DP 前言 线性DP 数字三角形模型 摘花生 最小路径和 不同路径模型 不同路径(有障碍) 过河卒 (综合应用) 最长上升子序列模型 木棍加工 导弹拦截 完结散花 参考文献 前 ...
- 2020.8.3【算协集训】线性dp
线性dp A - 超级楼梯 (HDU-2041) 分析 代码 B - 一只小蜜蜂... (HDU-2044) 分析 代码 C - 母牛的故事 (HDU-2018) 分析 代码 D - Common S ...
- A. Boredom(线性dp基础题)
题目的大意是:给定你一个数组,每次可以删掉一个大小为a的数,获得a的分数,同时删除数列中所有大小为a+1和a-1的数.问删除所有数组中的数后,能够获得的最大分数值. 思路:本题可以用线性dp来解决.d ...
最新文章
- swift_014(Swift 的控制流)
- Golang新开发者要注意的陷阱和常见错误
- 部分手机配置信息及价格
- 你以为ACI=SDN?大错特错!
- python字符串(连载二)|字符串内置函数原来还可以这么玩!
- 【车联网】一文了解5G在车联网中的应用
- ubuntu16.04 kinetic 版本ROS安装PR2
- 基于麻雀搜索算法优化概率神经网络PNN的分类预测-附代码
- 降龙十八掌之SpringBoot 使用Swagger2打造在线接口文档
- 计算机并口回路测试工具,COM口和LPT口回路环的制作与CheckIT3.0测试方法
- 信息学竞赛 c语言 pascal,pascal信息学竞赛教程
- 2023年全国最新机动车签字授权人精选真题及答案10
- 2021.11.16【读书笔记】丨宏基因组分析流程
- java FFMPEG调取usb摄像头,截取视频,添加文字和时间水印
- LCD1602的使用详解
- 3GPP TS 23501-g51 中英文对照 | 5.2.3 Identification and authentication
- ThinkPad开机停留在boot menu界面、进不了系统的解决方法
- 2021-09-15单片机方案——LED补光灯方案
- 峨眉派的创始人真的是郭襄吗?
- Blob开头视频链接如何下载