ATCODER ABC209F Deforestation 基础题解
时间:2021-07-13
本文章向大家介绍ATCODER ABC209F Deforestation 基础题解,主要包括ATCODER ABC209F Deforestation 基础题解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
分析
状态定义:\(dp[i][j] | (j \le i)\)表示前\(i\)棵树中,第\(i\)棵树是第\(j\)棵被砍的排列的方案数。
状态转移:根据讨论,如果\(H_i > H_{i+1}\),则先砍\(H_i\)。如果\(H_i < H_{i+1}\),则先砍\(H_{i+1}\)。如果\(H_i = H_{i+1}\),则先砍这两棵树都可以。总之,谁高就先砍谁。
if(H[i] > H[i+1]) \(dp[i+1][j] = \sum_{k=1}^{j-1} dp[i][k]\),就是第\(i\)棵树只要在第\(i+1\)棵树之前的任何一个位置被砍都是合法的排列方案。
if(H[i] < H[i+1]) \(dp[i+1][j] = \sum_{k=j}^{i}dp[i][k]\) , 就是第\(i\)棵树只能在位置\(j-i\)被砍。这是有一个比较特殊的地方,就是第\(i\)棵树似乎应该在位置\(j+1\)及之后被砍。为什么位置\(j\)也可以呢?
我的理解是:对于第\(i\)棵树是在位置\(j\)被砍的排列,把第\(i+1\)棵树强行安排在位置\(j\)去砍,相当于第\(i\)棵树及后面的树都后移一个位置,得到的排列仍然合法。
if(H[i] == H[i+1]) \(dp[i+1][j] = \sum_{k=1}^i dp[i][k]\), 就是第\(i\)棵树的被砍位置不影响第\(i+1\)棵树的位置。
TLE 代码
#include<bits/stdc++.h>
using namespace std;
#define MAXN 4005
#define MOD (int)(1E9+7)
int h[MAXN];
int dp[MAXN][MAXN];
int n, ans;
int main(){
cin >> n;
for(int i = 1; i <= n; i++) cin >> h[i];
dp[1][1] = 1;
for(int i = 1; i < n; i++){
for(int j = 1; j <= i+1; j++)
if(h[i] == h[i+1])
for(int k = 1; k <= i; k++)
dp[i+1][j] += dp[i][k], dp[i+1][j] %= MOD;
else if(h[i] > h[i+1])
for(int k = 1; k <= j-1; k++)
dp[i+1][j] += dp[i][k], dp[i+1][j] %= MOD;
else
for(int k = j; k <= i; k++)
dp[i+1][j] += dp[i][k], dp[i+1][j] %= MOD;
}
for(int j = 1; j <= n; j++) {
ans += dp[n][j];
ans %= MOD;
}
cout << ans << endl;
}
AC代码,空间未优化
#include<bits/stdc++.h>
using namespace std;
#define MAXN 4005
#define MOD (int)(1E9+7)
int h[MAXN];
long long dp[MAXN][MAXN], sum[MAXN][MAXN];
int n, ans;
int main(){
cin >> n;
for(int i = 1; i <= n; i++) cin >> h[i];
dp[1][1] = sum[1][1] = 1;
for(int i = 1; i < n; i++)
for(int j = 1; j <= i+1; j++) {
if(h[i] == h[i+1])
dp[i+1][j] += sum[i][i], dp[i+1][j] %= MOD;
else if(h[i] > h[i+1])
dp[i+1][j] += sum[i][j-1], dp[i+1][j] %= MOD;
else {
dp[i+1][j] += sum[i][i] - sum[i][j-1], dp[i+1][j] %= MOD;
if(dp[i+1][j] < 0) dp[i+1][j] += MOD;
}
sum[i+1][j] += (sum[i+1][j-1] + dp[i+1][j]) % MOD;
}
for(int j = 1; j <= n; j++) {
ans += dp[n][j];
ans %= MOD;
}
cout << ans << endl;
}
原文地址:https://www.cnblogs.com/apachecq/p/15008340.html
- spring-data-mongodb mapreduce使用
- 项目中如何设计通用的评论模块
- java8 stream
- spring boot中自定义错误提示页面
- spring boot中删除Data MongoDB的_class
- 用aop加redis实现通用接口缓存
- spring boot 实现mysql读写分离
- spring boot集成druid连接池
- spring boot整合dubbox进行服务拆分
- Spring Cloud中如何保证各个微服务之间调用的安全性
- Spring Boot Actuator监控页面报错解决
- Spring Cloud中如何优雅的使用Feign调用接口
- Spring Cloud Eureka 集群高可用
- Spring Cloud Eureka 增加权限认证
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- javafx框架tornadofx实战-益智游戏-找出指定的内容1
- Qt音视频开发8-ffmpeg保存裸流
- PyTorch6:nn.Linear&常用激活函数
- Python制作图片验证码?也就三行代码罢了
- 小技巧整理(一)
- 20个能够有效提高 Pandas数据分析效率的常用函数,附带解释和例子
- 4.深入k8s:持久卷PV、PVC及其源码分析
- 5.深入k8s:StatefulSet控制器及源码分析
- 简介机器学习中的特征工程
- 在机器学习回归问题中,你应该使用哪种评估指标?
- 6.深入k8s:守护进程DaemonSet及源码分析
- 无所不能的Embedding 1 - Word2vec模型详解&代码实现
- 【JS】676- 1.1w字 | 初中级前端 JavaScript 自测清单 - 2
- matplotlib基础绘图命令之imshow
- 聊聊dubbo-go的broadcastCluster