Contest Website : atcoder.jp/contests/dp

\[\begin{array}{c|C|c|c}
TaskNum & TaskName & Status & Algorithm \\
\hline
A & Frog 1 & \color{green}{AC} & \text{简单线性DP} \\
\hline
B & Frog 2 & \color{green}{AC} & \text{简单线性DP,TaskA加强版} \\
\hline
C & Vacation & \color{green}{AC} & \text{简单线性DP} \\
\hline
D & Knapsack 1 & \color{green}{AC} & \text{OI背包} \\
\hline
E & Knapsack 2 & \color{yellow}{WA} & \text{01背包重大价小} \\
\hline
F & LCS & \color{green}{AC} & \text{最长公共子序列} \\
\hline
G & Longest Path & \color{green}{AC} & \text{DAG上DP} \\
\hline
H & Grid 1 & \color{green}{AC} & \text{矩阵DP} \\
\hline
I & Coins & \color{green}{AC} & \text{概率DP} \\
\hline
J & Sushi & \color{green}{AC} & \text{期望DP} \\
\hline
K & Stones & \color{green}{AC} & \text{博弈论} \\
\hline
L & Deque & \color{green}{AC} & \text{区间DP} \\
\hline
M & Candies & \color{green}{AC} & \text{前缀和优化线性DP} \\
\hline
N & Slimes & \color{green}{AC} & \text{区间DP} \\
\hline
O & Matching & \color{green}{AC} & \text{状压DP} \\
\hline
P & Independent Set & \color{green}{AC} & \text{树形DP} \\
\hline
Q & Flowers & & \\
\hline
R & Walk & & \\
\hline
S & Digit Sum & & \\
\hline
T & Permutation & & \\
\hline
U & Grouping & & \\
\hline
V & Subtree & & \\
\hline
W & Intervals & & \\
\hline
X & Tower & & \\
\hline
Y & Grid 2 & & \\
\hline
Z & Frog 3 & & \\
\end{array}
\]

A. Frog 1

We define \(f_i\) as the minimum cost for the frog to jump from the 1st stone to the \(i\)-th stone.

And we know that the frog can only jump from the \((i-1)\)-th stone or the \((i-2)\)th stone to the \(i\)-th stone. Thus, we can know the equation. It is:

\[f_i=\operatorname{min}\{f_{i-1}+\left\vert h_i-h_{i-1} \right\vert ,f_{i-2}+\left\vert h_i-h_{i-2} \right\vert \}
\]

\(O(n)\) ~

B. Frog 2

\[f_{i+j}=\operatorname{min}\{f_i+\left\vert h_i-h_{i+j}\ \right\vert\},1\le j\le k
\]

Why don't I use \(f_{i-j}\) to transfer to \(f_i\)? That's because I don't want to check if \(i-j < 0\). I think this is an unimportant skill

\(O(nk)\)

C. Vacation

Easy~

We define \(f_{i,j}\) is the maximum points of happiness at Day i, and we choose activity j at Day i. We cannot choose activity j at Day i+1.

So, \(f_{i,j}\) can be transfered from \(f_{i-1,k}\, ,k\neq j\).

\[f_{i,1} = \operatorname{max}\{f_{i-1,2},f_{i-1,3}\} + a_i
\]
\[f_{i,2} = \operatorname{max}\{f_{i-1,1},f_{i-1,3}\} + b_i
\]
\[f_{i,3} = \operatorname{max}\{f_{i-1,1},f_{i-1,2}\} + c_i
\]

The answer is \(\operatorname{max}\{f_{n,1},f_{n,2},f_{n,3}\}\).

\(O(n)\) ~

D. Knapsack 1

01 backpack.

Because I cannot explain it in English, so I will only write the equation.

\(i\) is the i-th item, \(v\) refers to the remaining capacity.

\[f_{v}=\operatorname{max}\{f_v,f_{v-w_i}+c_i\}
\]

\(O(nw)\)

F. LCS

嘤语不会用了QAQ

定义 \(f_{i,j}\) 为 \(s\) 串前 \(i\) 个字符和 \(t\) 串前 \(j\) 个字符的LCS。

\[f_{i,j}=\begin{cases}
f_{i-1,j-1}+1, & s_i=t_j \\
\operatorname{max}\{f_{i-1,j},f_{i,j-1}\}, &\text{otherwise}
\end{cases} \]

\(O(n^2)\)

G. Longest Path

We have two methods to solve this task.

First, we use Topological sorting. Then, we can traverse the topological order from back to front.

Second, we can use the memorizing search method.

\[f_{i}=\operatorname{max}\{f_{j}+1\}
\]

\(O(n+m)\)

H. Grid 1

Matrix DP.

We can walk to the right and the bottom point.

So, we can walk from the left and the top point.

\[f_{i,j}=f_{i-1,j}+f{i,j-1}
\]

\(O(HW)\)

I. Coins

Probability DP.

We define f[i][j] is the probability of \(j\) out of the first \(i\) coins turned heads.

So, if we need \(j\) coins turns heads, we have \(2\) options.

  1. There are \(j\) out of the first \(i - 1\) coins turned heads and the i-th coin flip to the back.
  2. There are \(j - 1\) out of the first \(i - 1\) coins turned heads and the i-th coin turn to the front.
\[f_{i,j}=f_{i-1,j} * (1-p_i) + f_{i-1,j-1}*p_i
\]

\(O(n^2)\)

J. Sushi

求期望。

设 \(f_{i,j,k}\) 为还剩 \(i\) 个盘子有一个寿司,\(j\) 个盘子有两个寿司,\(k\) 个盘子有三个寿司时的期望值。

方程不会写。

\(O(n^3)\)

K. Stones

Game theory.

If there left \(k\) stones left and this state can win, then there must a state of \(f\) that \(k-a_i=f\) and this state must lose.

\[f_{i} = 1, f_{i - a_j} = 0\; and\;1 \le j \le n
\]

L. Deque

The first type of Range DP.

We define \(f_{i,j}\) as the maximum value the first people can get in the range \([i,j]\).

So, \(f_{i,j}\) can be translated from \(f_{i+1,j}\) and \(f_{i,j-1}\).

\[f_{i,j}=\sum_{i-1}^{j} a_i - \operatorname{min}\{f_{i+1,j},f_{i,j-1}\}
\]

\(O(n^2)\)

M. Candies

Prefix Sum Optimization.

First, we all know that

\[f_{i,j}=\sum_{k=j-a_i}^{j} f_{i,k}
\]

But the time complexity of this algorithm is \(O(nk^2)\), So we cannot pass this task with this algo.

So we need Prefix Sum Optimization. We define \(pre_{m}\) as \(\sum_{k=1}^{m}f_{i,k}\).

\[f_{i,j}=pre_j-pre_{j-a_i-1}
\]

Sth about Educational DP Contest的更多相关文章

  1. Atcoder Educational DP Contest

    前面简单一点的题直接过吧. A 暴力DP B 怎么还是暴力DP C 还是暴力DP D 直接背包 E 这个背包不太一样了,这里有一个技巧,就是因为价值很小,所以直接对价值背包,求出来达到某一个权值最小的 ...

  2. Atcoder Educational DP Contest 题解

    A - Frog 1/B - Frog 2 入门... #include<cstdio> #define abs(a) ((a)>=0?(a):(-(a))) #define min ...

  3. Atcoder Educational DP Contest I - Coins (概率DP)

    题意:有\(n\)枚硬币,每枚硬币抛完后向上的概率为\(p[i]\),现在求抛完后向上的硬币个数大于向下的概率. 题解:我们用二维的\(dp[i][j]\)来表示状态,\(i\)表示当前抛的是第\(i ...

  4. Educational DP Contest H - Grid 1 (DP)

    题意:有一个\(n\)X\(m\)的图,"#"表示障碍物,"."表示道路,只能向右或向下走,问从左上角走到右下角的方案数. 题解:这题可以用bfs来搞,但dp更 ...

  5. Educational DP Contest G - Longest Path (dp,拓扑排序)

    题意:给你一张DAG,求图中的最长路径. 题解:用拓扑排序一个点一个点的拿掉,然后dp记录步数即可. 代码: int n,m; int a,b; vector<int> v[N]; int ...

  6. Educational DP Contest F - LCS (LCS输出路径)

    题意:有两个字符串,求他们的最长公共子序列并输出. 题解:首先跑个LCS记录一下dp数组,然后根据dp数组来反着还原路径,只有当两个位置的字符相同时才输出. 代码: char s[N],t[N]; i ...

  7. Educational DP Contest E - Knapsack 2 (01背包进阶版)

    题意:有\(n\)个物品,第\(i\)个物品价值\(v_{i}\),体积为\(w_{i}\),你有容量为\(W\)的背包,求能放物品的最大价值. 题解:经典01背包,但是物品的最大体积给到了\(10^ ...

  8. 【DP】Educational DP Contest

    这份 dp 题单的最后几题好难 orz. 前面的题比较简单,所以我会选取一些题来讲,其它的直接看代码理解吧 qwq. 传送门: https://atcoder.jp/contests/dp 全部 AC ...

  9. AtCoder Educational DP Contest 总结

    前言 感觉都初一升初二了,再做这个题是不是有点太菜了啊-- 里面大概都是些 DP 板子题(确信,题目质量还挺高的,不过不涉及太难的优化(实际上只有最后一题是斜率优化). 不管了,还是写个 blog 来 ...

随机推荐

  1. SQL修改表约束实现

    先删除表约束 Alter Table 表名 Drop Constraint 约束名 然后再新建约束(加上级联删除) Alter Table Table_Name Add Constraint FK_T ...

  2. Spring学习日记01_IOC_xml的三种注入方式

    什么是IOC 控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理 使用IOC目的:为了耦合度降低 做入门案例就是IOC实现 IOC底层原理 xml解析 工厂模式 反射 原始方式 cla ...

  3. 一致性hash原理 看这一篇就够了

    ​ 在了解一致性哈希算法之前,最好先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那么,我们先来描述一下这个经典的分布式缓 ...

  4. C++容器类插入和删除时迭代器的失效情况总结

    容器底层数据结构类型 包含的具体容器 内存分配特点 insert操作后迭代器失效情况 erase操作后迭代器失效情况 数组型数据结构 vector, string, deque, array 元素分配 ...

  5. excel计数函数COUNTIF、COUNTIFS

    1.单条件计数:COUNTIF(条件区域,指定条件) =COUNTIF($H$2:$H$8,L2)求H2:H8中值等于L2的行记录数,这里求的是游泳项目总共有多少个人参加 2.多条件计数:COUNTI ...

  6. Unity异步加载进度条

    先上代码: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngi ...

  7. 『动善时』JMeter基础 — 52、使用JMeter测试Dubbo接口

    目录 1.Dubbo介绍 2.准备测试Dubbo接口的环境 3.Dubbo Sample界面详解 4.Dubbo Sample组件的使用 (1)测试计划内包含的元件 (2)使用zookeeper协议请 ...

  8. 13、mysql主从复制原理解析

    13.1.mysql主从复制介绍: 1.普通文件,磁盘上的文件的同步方法: (1)nfs网络文件共享可以同步数据存储: (2)samba共享数据: (3)ftp数据同步: (4)定时任务:cronta ...

  9. 使用Vue-Cli搭建Ant Design Vue前端开发环境

    如果文章有帮助到你,还请点个赞或留下评论 搭建脚手架 环境准备 nodeJS vue-cli 如果没有安装点击此处查看安装方法 进入 vue ui 1.打开终端,输入命令 vue ui 2.选择项目存 ...

  10. JUnit5的Tag、Filter、Order、Lifecycle

    Tag JUnit5可以使用@Tag注解给测试类和测试方法打tag,这些tag能用来在执行时进行过滤,它跟group有点类似. tag应该遵循以下规则: 不能为null或者为空. 不能包含空格. 不能 ...