【简】题解 AWSL090429 【数塔问题】

因为每次只ban一个点 而且不是永久性的
预处理出每个点从上往下和从下往上的最大值
每次询问直接暴力 被ban掉点那行去掉那点的最大值
也可以直接预处理出每行的最大值和次大值
还有种做法貌似可以过
预处理出被ban的点是否在链上
是直接输出原本的最大的值 O(1)回答
不是暴力更新被ban的点会影响的到的那个菱形的区域 数组记录答案避免重复询问
最多这样更新n次 平均一次 n*n/4 总复杂度(n^3)/4
只要常数小+数据水就可以过了
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define C getchar()-48
inline ll read()
{
ll s=,r=;
char c=C;
for(;c<||c>;c=C) if(c==-) r=-;
for(;c>=&&c<=;c=C) s=(s<<)+(s<<)+c;
return s*r;
}
#define R register
const int N=;
int n,m,ans;
int a[N][N],vis[N][N],mx[N][N],b[N][N],k[N][N];
inline void work1()
{
for(R int i=n-;i>=;i--)
for(R int j=;j<=i;j++)
{
if(a[i+][j]>=a[i+][j+]) mx[i][j]=,a[i][j]+=a[i+][j];
else mx[i][j]=,a[i][j]+=a[i+][j+];
}
for(R int i=,j=;i<=n;i++){vis[i][j]=;j+=mx[i][j];}
}
inline void work2()
{
for(int i=;i<=n;i++)
for(int j=;j<=i;j++)
b[i][j]+=max(b[i-][j-],b[i-][j]);
}
inline int work3(int x,int y)
{
int ans=;
for(int i=;i<=x;i++)
{
if(i==y) continue;
ans=max(ans,b[x][i]+a[x][i]-k[x][i]);
}
return ans;
}
int main()
{
freopen("tower.in","r",stdin);
freopen("tower.out","w",stdout);
n=read(),m=read();
for(R int i=;i<=n;i++)
for(R int j=;j<=i;j++)
k[i][j]=a[i][j]=b[i][j]=read();
work1();work2();
for(R int i=;i<=m;i++)
{
int x=read(),y=read();
if(x==&&y==){printf("-1\n");continue;}
if(!vis[x][y]){printf("%d\n",a[][]);continue;}
printf("%d\n",work3(x,y));
}
return ;
}
【简】题解 AWSL090429 【数塔问题】的更多相关文章
- Hdoj 2084.数塔 题解
Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大 ...
- 题解报告:hdu 2084 数塔(递推dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这 ...
- 数塔(杭电oj2084)
Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大 ...
- 数塔问题(DP算法)自底向上计算最大值
Input 输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数 ...
- dp入门--poj 1163数塔
...
- ACM 杭电HDU 2084 数塔 [解题报告]
数塔 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- [ACM_动态规划] 数字三角形(数塔)
递归方法解决数塔问题 状态转移方程:d[i][j]=a[i][j]+max{d[i+1][j],d[i+1][j+1]} 注意:1\d[i][j]表示从i,j出发的最大总和;2\变界值设为0;3\递归 ...
- HDU-2084 数塔 经典dp,水
1.HDU-2084 数塔 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 3.总结:从下往上推,最后归于顶点.方程为 dp[i][j] ...
- HDU2084基础DP数塔
数塔 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- hdu----(2084)数塔(dp)
数塔 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
随机推荐
- mysql 设置自增主键id的起始值
修改user表,主键自增从20000开始 alter table user AUTO_INCREMENT=20000;
- nginx系列7:处理HTTP请求的11个阶段
处理HTTP请求的11个阶段 如下图: 序号 阶段 指令 备注 1 POST_READ realip 获取客户端真实IP 2 SERVER_REWRITE rewrite 3 FIND_CONFIG ...
- es6 for of 循环
es6 新增了 for of 循环,只要继承了Iterator 接口的数据集合都可以使用 for of 去循环 for of 循环,统一数据集合的循环方法,解决了forEach循环的不能使用break ...
- 三、Snapman多人协作电子表格之——软件的基本功能
Snapman多人协作电子表格是一个即时工作系统. 一.SnapmanServer服务端 SnapmanServer服务端在安装Snapman软件一起自带,是一个小巧的控制台程序SnapmanServ ...
- Python 标准类库 - 因特网协议与支持之socketserver
标准类库 - 因特网协议与支持之socketserver by:授客 QQ:1033553122 socketserver 模块,简化网络服务编写任务. 创建服务的步骤 1 通过子类化BaseReq ...
- Android Studio教程09-加载器Loader的使用
目录 1.加载器特征 2. Loader API 3. 在应用中使用Loader 3.1. 启动加载器 3.2. 重启加载器 3.3. 使用LoaderManager回调 4. 实例: 访问用户联系人 ...
- event 和delegate的分别
突然想起delegate委托是支持+= 和-=操作的,然后研究一下究竟这个是怎么做到的,好模仿一下.一开始以为是+=的运算符重载,但是在类库参考中并没有这个运算符重载,只有!= 和==运算符重载.有点 ...
- javafx:JavaFX Scene Builder 2.0打开含有第三方jar包的fxml文件报错 Caused by: java.lang.ClassNotFoundException
报错如下: java.io.IOException: javafx.fxml.LoadException: /C:/User.................test.fxml at com.orac ...
- WDS和DHCP配置说明
网络启动程序 (NBP) 是网络启动过程中第一个下载和执行的文件,它可以控制启动开始时的体验(例如,用户是否必须按 F12 才能开始网络启动) WDS服务器配置说明: 1)如果WDS和DHCP安装在同 ...
- MySQL SET数据类型
SET: 多选字符串数据类型,适合存储“多个值”. 设定set的时候,同样需要设定“固定的几个值”:存储的时候,可以存储其中的若干个值. 设定set的格式: 字段名称 SET("选项1&q ...